Android觸屏事件傳遞(個人實踐總結)

來源:互聯網
上載者:User

標籤:觸屏   事件   touch   事件傳遞   

Android觸屏事件傳遞一:前言    之前由於做Launcher部分,涉及到許多互動的部分,因為項目過去很長時間了,最近又在做GTS,CTS的測試與修改,好多都不熟悉甚至忘記了,結合別人的文章經驗(我發現有些地方和別人有出入,但自己經測實驗證),加上自己的測試,今天寫下文章來總結一下。
二:關於ViewGroup與其中的view視圖    ViewGroup是一個容器類,一般,版面配置容器是繼承字它的。容器裡面可以存放視圖,當然也可以嵌套容器,比如Relativelayout,LinearLayout等等。我這裡所說的view視圖是只繼承view的類,沒有繼承容器類(ViewGroup)。因為後面降到的事件傳遞的小差異和這個有關係。繼承自ViewGroup的類裡面有interceptTouchEvent(),而沒有繼承ViewGroup的類沒有這個方法,這個方法是負責攔截touch事件的。三:事件傳遞   1:一般,針對ViewGroup ,事件傳遞有三個方法。
  •   dispatchTouchEvent(); 負責事件分發,如果返回值為true,表示事件不繼續分發,也不進行消費(執行onTouchEvent(),如果onTouchEvent()返回true表示消費完,false表示沒有消費完),然後一級一級向上執行容器類的dispatchTouchEvent(),並且每一級的返回值為true;如果dispatchTouchEvent()返回值為false,則交給父類分發給interceptTouchEvent();

  •   interceptTouchEvent();負責事件攔截,如果返回false,表示不攔截,touch事件交給下一級的視圖處理,如果攔截,則交給這一級的onTouchEvent()來處理;

  •   onTouchEvent();負責消費事件,如果返回值為true,表示消費了事件,事件消失;如果返回值為false,則向上一級執行onTouchEvent(),如果上一級繼續返回false,則繼續向上,如果每一級都返回false,則進入死迴圈,導致ANR,android 5.1也會死迴圈,我測試不會導致ANR(可能公司手機還沒有適配好),為了避免這種情況,可以在Activity的onTouchEvent()返回true;
........... extends Activity{    public boolean dispatchTouchEvent(MotionEvent ev) {         return true;    }}
  2:針對不是容器類的View
  •    dispatchTouchEvent(); 負責事件分發,如果返回值為true,表示事件不繼續分發,也不進行消費(執行onTouchEvent(),如果onTouchEvent()返回true表示消費完,false表示沒有消費完),這裡注意了,一般這個View都存在於一個容器中,但是不執行父容器的dispatchTouchEvent(),而是執行父父容器的dispatchTouchEvent(),然後向上遞迴傳遞,為什嗎?個人覺得是:因為沒有繼承ViewGroup的(不是容器類),它沒有子View,他和父容器的dispatchTouchEvent()處理時是調用的同一個,所以雖然有事件分發函數;如果dispatchTouchEvent()返回值為false,則交給父類分發給onTouchEvent()消費;個人感覺最好不要在dispatchTouchEvent()裡面強行返回false,並且在裡面做UI處理。

  •    onTouchEvent();負責消費事件,如果返回值為true,表示消費了事件,事件消失;如果返回值為false,則向上一級執行onTouchEvent(),如果上一級繼續返回false,則繼續向上,如果每一級都返回false,則進入死迴圈,導致ANR,android 5.1也會死迴圈,我測試不會導致ANR(可能公司手機還沒有適配好),為了避免這種情況,可以在Activity的onTouchEvent()返回true;

   3:關於Activity的dispatchTouchEvent()和onTouchEvent();   一個事件開始於Activity的dispatchTouchEvent()方法,並向DecorVIew(setContentView()裡面的view)下面傳遞的.

待上代碼  

Android觸屏事件傳遞(個人實踐總結)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.