是这样,原本有一个功能,是用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,拦截事件。

 

更多推荐