android的View事件分发机制

答案:

这个问题可以写个长篇大论,但在面试时被问到时要从以下几个方面入手。

记住这个原则:Android的事件总是从父控件往子控件分发。子控件都不处理时事件再回传父控件。很多问题可以根据这个原则推导出来。

三个方法:

dispatchTouchEvent:负责接收事件,返回false则表示向子控件分发事件。

onInterceptTouchEvent:返回true表示拦截,同时调用onTouchEvent方法。

onTouchEvent:处理事件,一般重写此方法,返回true表示消耗掉该事件并不再传递下去,返回false表示不处理事件并把事件退回父控件。

View和ViewGroup

所有的控件都继承自View。

所有的布局都继承自ViewGroup,ViewGroup则继承自View。

View没有onInterceptToutchEvent方法,所以dispatchTouchEvent直接调用onTouchEvent。

流程(Activity > ViewGroup > View)

Activity是事件的起点,事件分被封装成MotionEvent对象发给Activity的dispatchTouchEvent方法。

dispatchTouchEvent内部会把事件传给setContentView指定的布局,即根布局ViewGroup。

根布局的dispatchTouchEvent在接收到事件后调用onInterceptTouchEvent方法。

onInterceptTouchEvent方法会判断是否拦截该事件,如果拦截就将事件传给onTouchEvent方法处理。不拦截就直接把事件传给子控件。

onTouchEvent方法负责处理事件,返回值决定是否要消费掉该事件,返回true表示以后由此控件来处理该事件,返回false表示以后也不再接收该事件。

当所有控件的onTouchEvent都返回false时事件由Activity的onTouchEvent来处理。

优先级

OnTouchListener,onTouchEvent,onClickListener执行顺序

onTouch(ACTION_DOWN) => onTouchEvent(ACTION_DOWN) => onTouch(ACTION_UP) =>  onTouchEvent(ACTION_UP) => onClick

你可能感兴趣的:(android的View事件分发机制)