android RecyclerView禁止多点触控

在Android应用中,RecyclerView点击显示PopupWindow功能遇到多点触控问题,导致多个PopupWindow同时出现并重叠。尝试通过设置android:splitMotionEvents属性为"false"无效。最终解决方案是通过监听View的触控事件,识别ACTION_POINTER_DOWN和ACTION_POINTER_UP,返回true来拦截多点触控事件,从而避免PopupWindow的异常弹出。

是这样,原本有一个功能,是用RecyclerView实现的,点击每个item都会弹出一个PopupWindow。

好的,用正常的方法实现就好。(注意点就是各个popupwindow的位置)

然后有一天,发现多个手指同时点击,比方说用三个手指分别点击三个item,则会同时弹出三个PopupWindow,出现了重叠。不难想象出是什么样的效果,,,

怎么改呢?

第一反应,多点触控。肯定是跟这个有关。

1、禁止某个View的多点触控,直接在该view所在布局的根上加android:splitMotionEvents="false"。

试了,无效。

2、在该View所在页面(Activity/Fragment)的根布局添加android:splitMotionEvents="false"。

试了,无效。

3、给该View设置监听,去掉多点触控。有效。

weather_live_recycler_living_index?.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener{
            override fun onTouchEvent(p0: RecyclerView, p1: MotionEvent) {
            }

            override fun onInterceptTouchEvent(p0: RecyclerView, p1: MotionEvent): Boolean {
                when(p1.action and MotionEvent.ACTION_MASK) {
                    MotionEvent.ACTION_DOWN -> {
                        return false
                    }
                    MotionEvent.ACTION_POINTER_DOWN -> {
                        return true
                    }
                }
                return false
            }

            override fun onRequestDisallowInterceptTouchEvent(p0: Boolean) {
            }
        })

 

备注:

ACTION_MASK在Android中是应用于多点触摸操作

ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多点触摸屏幕,当有一只手指按下去的时候,另一只手指按下和放开的动作捕捉;

ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作;

ACTION_MOVE就是手指在屏幕上移动的操作;

使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。

 

常量值: 

ACTION_MASK    0x000000ff
ACTION_DOWN    0x00000000        ACTION_UP     0x00000001       ACTION_MOVE    0x00000002
ACTION_POINTER_DOWN      0x00000005          ACTION_POINTER_UP      0x00000006
ACTION_POINTER_1_DOWN    0x00000005          ACTION_POINTER_1_UP     0x00000006
ACTION_POINTER_2_DOWN    0x00000105          ACTION_POINTER_2_UP     0x00000106

可以看到,and运算的结果总是小于等于0x000000ff,那就是说and之后,无论你多少根手指加进来,都是会ACTION_POINTER_DOWN或者ACTION_POINTER_UP 。

MotionEvent.ACTION_DOWN代表的是第一次按下的事件,MotionEvent.ACTION_POINTER_DOWN代表的是剩余的按压点触发的事件。通过return true,拦截事件。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值