消息事件 从驱动获取然后写入到\dev\input中,然后进行一级级的派发,最终达到WindowManagerService然后派发到各个窗口当中去。
EventHub是Linux驱动和Android框架层的接口
主要的消息事件:onClick onLongClick onFocusChange onKey onTouch onKeyDown onKeyUp onTrackballEvent onTouchEvent
触控事件:MotionEvent ACTION_UP ACTION_MOVE ACTION_CANCEL ACTION_OUTSIDE(UI外触发) ACTION_POINTER_DOWN ACTION_POINTER_UP ACTION_POINTER_INDEX_MASK ACTION_POINTER_INDEX_SHIFT ACTION_POINTER_1_UP
ACTION_POINTER_1_DOWN
手势识别 GestureDetector OnGestureListener OnDoubleTapListener SimpleOnGestureListener实现了(OnGestureListener,OnDoubleTapListener接口)可以只重写自己需要的接口,其它的可以不管
OnGestureListener接口
onDown onShowPress onSingleTapUp onScroll onLongPress onFling
OnDoubleTapListener接口
onSingleTapConfirmed onDoubleTap onDoubleTapEvent
dispatchKeyEvent dispatchTouchEvent dispatchTrackballEvent
总结:
消息顺序
dispatchTouchEvent----
on
InterceptTouchEvent----onTouch---
onTouchEvent
消息处理顺序:先 父ViewGroup---子ViewGroup---子View(由上层到底层父控件)
父View消息截获:子View获取消息要询问父View的
on
InterceptTouchEvent,如true,表示父View处理。
子View防止父View消息截获:
getParent().requestDisallowInterceptTouchEvent(true)
View调用顺序,先底层再上层,如 ViewGroup中有Button,点击Button时先响应,如果该控件在
onTouchEvent 返回true,则消息到此结束,如果返回false,该消息会传递给ViewGroup。
消息传递顺序:
dispatchTouchEvent onInterceptTouchEvent
在消息接收时,子View调用
dispatchTouchEvent
然后
响应
onTouchEvent前,都必须征求父View的同意即
onInterceptTouchEvent,如果父View在该函数中返回true,表示父View截获该消息,该消息不会向深处继续传递即子View收不到该消息。
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
- mOnTouchListener.onTouch(this, event)) {
- return true;
- }
- return onTouchEvent(event);
- }
但是 父View截获消息 也可以被底层view通过
getParent().requestDisallowInterceptTouchEvent(true)来阻止父层的view来截获消息。该函数的作用是 通知父层不能截获该消息:
//通知父层ViewGroup不能截获
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
//当用户按下的时候,我们告诉父组件,不要拦截我的事件(这个时候子组件是可以正常响应事件的),
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
pager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
pager.requestDisallowInterceptTouchEvent(false);
break;
}