Android消息机制

        消息事件 从驱动获取然后写入到\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)

消息接收处理顺序: onTouchEvkent  
      View调用顺序,先底层再上层,如 ViewGroup中有Button,点击Button时先响应,如果该控件在 onTouchEvent  返回true,则消息到此结束,如果返回false,该消息会传递给ViewGroup。

消息传递顺序: dispatchTouchEvent onInterceptTouchEvent
    在消息接收时,子View调用 dispatchTouchEvent  然后 响应 onTouchEvent前,都必须征求父View的同意即 onInterceptTouchEvent,如果父View在该函数中返回true,表示父View截获该消息,该消息不会向深处继续传递即子View收不到该消息。

  1. public boolean dispatchTouchEvent(MotionEvent event) {  
  2.     if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
  3.             mOnTouchListener.onTouch(this, event)) {  
  4.             return true;  
  5.     }  
  6.     return onTouchEvent(event);  
  7. }  
但是 父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;  
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值