连麦标签怎么设置的(连麦系列之小窗拖动)
上篇文章说了下连麦状态下,小窗点击完成大小窗切换的逻辑,那么连麦的功能基本就能用了。那么接下来的问题就是完善一些小细节了。
今天要聊的就是小窗口的拖动。
其实单纯把小窗的位置固定住,其实也是有场景需要的,具体摆放的位置也是由产品和ui设计进行设计决定的。那么废话就不多说了,我们还是先分析一下具体的实现方式吧。
方式一:给 view 设置触摸时间,通过手指的滑动来计算出来view 需要的偏移量,然后再进行 view 的重绘方式二:通过 WindowManager 的方式来制作小窗,然后计算小窗的偏移量进行设置谈谈优劣
方式一
* 对现有布局基本无影响,可直接接入
* 不能悬浮在屏幕最上层,退出页面即销毁
方式二
* 去掉现有小窗布局,使用 WindowManager 来展现
* 能悬浮在屏幕最上层
* 需要申请悬浮窗权限
我暂时想到的就这两种方式,处于改动性小,用户使用体验来说,选择了方式一,因为 悬浮窗的方式 我们项目还是用不到的,而且还需要提醒用户授予悬浮窗的权限,“入侵性” 太强了,所以没有犹豫。
好,那就来说下实现方式吧!
第一步、创建可拖拽的父容器我这里创建的是 FrameLayout ,但是里面的实现方法是通用的。主要就是要重写 onTouchLayout 方法
public class DragFrameLayout extends FrameLayout {
private int width;
private int height;
private int screenWidth;
private int screenHeight;
private Context context;
//是否拖动
private boolean isDrag = false;
public boolean isDrag() {
return isDrag;
}
public DragFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getMeasuredWidth();
height = getMeasuredHeight();
screenWidth = ScreenUtils.getScreenWidth(context);
screenHeight = ScreenUtils.getScreenHeight(context) - getStatusBarHeight();
}
public int getStatusBarHeight() {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
return getResources().getDimensionPixelSize(resourceId);
}
private float downX;
private float downY;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (this.isEnabled()) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isDrag = false;
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
final float xDistance = event.getX() - downX;
final float yDistance = event.getY() - downY;
int l, r, t, b;
//距离大于10,认为是拖动事件,可根据项目的需求更改
if (Math.abs(xDistance) > 10 || Math.abs(yDistance) > 10) {
isDrag = true;
l = (int) (getLeft() xDistance);
r = l width;
t = (int) (getTop() yDistance);
b = t height;
if (l < 0) {
l = 0;
r = l width;
} else if (r > screenWidth) {
r = screenWidth;
l = r - width;
}
if (t < 0) {
t = 0;
b = t height;
} else if (b > screenHeight) {
b = screenHeight;
t = b - height;
}
this.layout(l, t, r, b);
}
break;
case MotionEvent.ACTION_UP:
setPressed(false);
break;
case MotionEvent.ACTION_CANCEL:
setPressed(false);
break;
}
return true;
}
return false;
}
}
这里就不做代码展示了,在布局文件中进行包裹即可别忘了包裹住大窗,因为大窗也会被缩放到小窗大小,且可拖动
第三步、在初始化大窗的时候,把这个可拖拽的父容器设置为不可用这样做的原因是,如果没有设置不可用,大窗在播放直播的时候,对大窗做上下滑动处理,会让大窗出现偏移量,出现背景。
DragFrameLayout.setEnabled(false);
即可
总结结合上一篇文章,小窗的点击完成 大小窗切换,小窗拖动的功能就完成了,关于直播还有很多小的问题,如果有时间会再继续更新文章,谢谢小伙伴们的支持~~~
奥力给 !
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com