最近研究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并且执行。