android view中touch的执行顺序
16lz
2021-01-26
最近研究android中launcher的源码中DragController中的onTouchEvent在屏幕选中桌面图标并且拖动的情况下会执行,如果不选中的话不会执行。研究源码发现,DragController中有如下代码。
public boolean onInterceptTouchEvent(MotionEvent ev) { if (false) { Log.d(Launcher.TAG, "DragController.onInterceptTouchEvent " + ev + " mDragging=" + mDragging); } final int action = ev.getAction(); if (action == MotionEvent.ACTION_DOWN) { recordScreenSize(); } final int screenX = clamp((int)ev.getRawX(), 0, mDisplayMetrics.widthPixels); final int screenY = clamp((int)ev.getRawY(), 0, mDisplayMetrics.heightPixels); switch (action) { case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_DOWN: // Remember location of down touch mMotionDownX = screenX; mMotionDownY = screenY; mLastDropTarget = null; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (mDragging) { drop(screenX, screenY); } endDrag(); break; } JbcaoLog.VLOG("dragcontroller onInterceptTouchEvent return "+mDragging); return mDragging; }
改方法返回值是判断是否拦截touchevent,使得子View不会有DispatchTouchEvent执行,mDragging表示的当前是否在托从中,如果在拖动中,返回true,则拦截touch事件,不传递到子View中,否则不拦截。不拦截的话先执行子View的onTouchEvent,我们注意到OntouchEvent和DisPatchTouchEvent都有布尔型的返回值,如果返回true,则代表此次的MotionEvent执行完毕,重新开始从父View中获取MotionEvent并且执行。
更多相关文章
- 拦截系统收到短信的Notification
- 深入浅出Android(安卓)Service (3)
- 2018年Android面试题整理
- Mac系统中,Eclipse没有显示设备
- Android(安卓)Studio 关于高德地图的开发:显示地图
- Android(安卓)拖动条(SeekBar)实例 附完整demo项目代码
- 可执行的android C 程序
- Android下执行Runtime.getRuntime().exec后返回状态
- activity实现滑动效果