Android(安卓)判断触摸点是否在某个view的区域,解决子view与parent的touch事件冲突
16lz
2021-01-26
//(x,y)是否在view的区域内private boolean isTouchPointInView(View view, int x, int y) { if (view == null) { return false; } int[] location = new int[2]; view.getLocationOnScreen(location); int left = location[0]; int top = location[1]; int right = left + view.getMeasuredWidth(); int bottom = top + view.getMeasuredHeight(); //view.isClickable() && if (y >= top && y <= bottom && x >= left && x <= right) { return true; } return false; }
@Override public boolean dispatchTouchEvent(MotionEvent ev) { int x = (int) ev.getRawX(); int y = (int) ev.getRawY(); if (isTouchPointInView(viewGroup, x, y)) { iosInterceptFlag = true; return super.dispatchTouchEvent(ev); } //do something }
此处顺便说一下ev.getX()
和ev.getRawX()
的区别
ev.getX()
:表示相对于控件自身左上角的X坐标
ev.getRawX()
:表示相对于手机屏幕左上角的X坐标
利用这个方法,也可以循环遍历找出点击的view了。
private View getTouchTarget(View view, int x, int y) { View targetView = null; // 判断view是否可以聚焦 ArrayList TouchableViews = view.getTouchables(); for (View child : TouchableViews) { if (isTouchPointInView(child, x, y)) { targetView = child; break; } } return targetView; }
利用这个方法isTouchPointInView()
,也可以让子view截获touch事件,解决与parent的冲突(特别是当parent重写了dispatchTouchEvent(MotionEvent ev)
方法)。
参考
http://blog.csdn.net/liufang1991/article/details/44303113
更多相关文章
- Android(安卓)View的scrollTo()、scrollBy() 和Scroller类总结
- android 通话记录去重查询方法
- android NDK开发 静态/动态注册 jni
- Android(安卓)WebView中无法用JS调用Java对象的问题
- 由一份 log 看 Binder
- GIT和repo使用方法:下载内核 android源码包
- android 网络编程 HttpGet类和HttpPost类使用详解
- Android本地存储——SQLite数据库
- Android列表实现单选、多选、全选、取消、删除