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






