android touch事件分發機制

轉載請註明出處:http://blog.csdn.net/ZhouLi_CSDN/article/details/45878337

看了網上那麼多的博客 ,對於android系統的事件處理仍然不是明白的特別透徹,或者一些博客講解的總是有些歧義或者講訴的不正確或者不全面。所以自己總結了一下事件的傳遞機制希望可以幫助到廣大的朋友。

  • 假設事件傳送路徑爲A-B-C-D-E;
  • 一個手勢是由事件action_down開始和action_move等其它事件以及事件action_up結束的集合;
  • 一個action_down意味着一個新的手勢的開始,aciton_up意味着一個手勢的結束;
  • 事件由activity的dispatchevent開始,通過調用子view(包括viewgroup)的dispatchevent向下傳遞,直到爲一個view爲止;
  • 之後事件會由最下層的view向上傳遞,由onTouchEvent進行處理,一直傳遞到activity的onTouchEvent;
    • 首先框架層最先處理的是action_down事件,如果此事件在傳遞過程中沒有被oninterceptEvent掉(返回true爲阻止),那麼此事件將一直傳遞到最下層;
    • 此時事件將開始由下開始往上傳遞,並且如果在途中某一層(假設爲D)消費掉(即onTouchEvent返回true),那麼此事件將終止向上傳遞,並且以後事件也會通過D的dispatchEvent方法直接調用onTouchEvent方法進行處理(事件傳遞順序A-B-C-D);
    • 如果傳遞過程中沒有任何onTouchEvent進行消費,那麼以後此事件將直接由activity的onTouchEvent進行處理。這意味着如果你想在某一層處理手勢,你務必要在該層消費action_down以確保以後可以接收到事件。
  • action_down事件處理結束後將開始其它事件的處理(以下事件都是除了action_down的事件);
  • 你可以在某一層的onInterceptEvent中隨時決定是否終止向下傳遞事件,這取決於你的手勢處理邏輯;onInterceptEvent之後你將永遠不能在向下傳遞事件了。
  • requestDisallowInterceptTouchEvent將阻止viewgroup對事件進行中斷;
  • 如果在某一層onTouchEvent處理某一事件,並進行消費掉,那麼該事件將不會在向上傳遞;否則將繼續向上傳遞。

touch事件圖解

其它知識介紹:
ViewConfiguration類保存了一些常量,是由框架層爲我們生成的。
1.其中getScaledTouchSlop 確定是否在滑動
2.fling,是否快速滑動
3.其它自己研究去吧。

目前先介紹到這裏,後續在更新!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章