连麦标签怎么设置的(连麦系列之小窗拖动)

连麦标签怎么设置的(连麦系列之小窗拖动)(1)

上篇文章说了下连麦状态下,小窗点击完成大小窗切换的逻辑,那么连麦的功能基本就能用了。那么接下来的问题就是完善一些小细节了。

今天要聊的就是小窗口的拖动。

其实单纯把小窗的位置固定住,其实也是有场景需要的,具体摆放的位置也是由产品和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

    分享
    投诉
    首页