亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

dispatchTouchEvent, interceptTouchEvent,onTouchEvent 詳細分析

2019-11-09 17:49:01
字體:
來源:轉載
供稿:網友

跟touch事件相關的3個方法: public boolean dispatchTouchEvent(MotionEvent ev); //用來分派event public boolean onInterceptTouchEvent(MotionEvent ev); //用來攔截event public boolean onTouchEvent(MotionEvent ev); //用來處理event

擁有這三個方法的類: Activity類: Activity dispatchTouchEvent(); onTouchEvent(); View容器(ViewGroup的子類): FrameLayout、LinearLayout…… ListView、ScrollVIew…… dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent(); View控件(非ViewGroup子類): Button、TextView、EditText…… dispatchTouchEvent(); onTouchEvent(); 三個方法的用法: dispatchTouchEvent() 用來分派事件。 其中調用了onInterceptTouchEvent()和onTouchEvent(),一般不重寫該方法 onInterceptTouchEvent() 用來攔截事件。 ViewGroup類中的源碼實現就是{return false;}表示不攔截該事件, 事件將向下傳遞(傳遞給其子View); 若手動重寫該方法,使其返回true則表示攔截,事件將終止向下傳遞, 事件由當前ViewGroup類來處理,就是調用該類的onTouchEvent()方法 onTouchEvent() 用來處理事件。 返回true則表示該View能處理該事件,事件將終止向上傳遞(傳遞給其父View); 返回false表示不能處理,則把事件傳遞給其父View的onTouchEvent()方法來處理 【注】:ViewGroup的某些子類(GridView、ScrollView…)重寫了onInterceptTouchEvent()方法,當發生ACTION_MOVE事件時,返回true進行攔截。

為了演示,重寫了4個類: 總統 –> MyActivity 省長 –> MyFrameLayout 市長 –> MyLinearLayout 農民 –> MyTextView

【舉個通俗易懂的例子】: 總統對省長說:我要吃紅燒魚 省長對市長說:你做個紅燒魚 市長對縣長說:你做個紅燒魚 縣長對農民說:你做個紅燒魚 ……(農民做呀做,沒做出來) 農民說:我盡力了,但真心不會做呀,饒了我吧 縣長說:你個笨蛋,下次不找你了,看我來做 ……(縣長做呀做,沒做出來) 縣長對市長說:我盡力了,非常抱歉,我不會做 市長說:你個廢物,要你何用,只能我自己來做了 ……(市長做呀做,做成功了) 市長對省長說:紅燒魚做好了 省長說:不錯,下次有事還找你 省長對總統說:紅燒魚做好了

總統說:不錯,下次有事還找你

總統對省長說:我要吃水煮魚 省長對市長說:你做個水煮魚 市長說:縣長連紅燒魚都搞不定,這次就不找他了,我自己親自來做 ……(市長做呀做,又成功了) 市長對省長說:水煮魚做好了 省長說:不錯,下次有事還找你 省長對總統說:水煮魚做好了

總統說:不錯,下次有事還找你

按常理,領導都會把任務向下分派,一旦下面的人把事情做不好,就不會再把后續的任務交給下面的人來做了,只能自己親自做,如果自己也做不了,就只能告訴上級不能完成任務,上級又會重復他的過程。 另外,領導都有權利攔截任務,對下級隱瞞該任務,而直接自己去做,如果做不成,也只能向上級報告不能完成任務。 【1】TextView的clickable屬性默認是false,所以TextView的onTouchEvent()方法默認返回false,程序輸出如下:

事件傳遞示意圖:

【2】把TextView的clickable屬性手動改成true,或者直接重寫onTouchEvent()方法,使其返回true,程序輸出如下:

事件傳遞示意圖:

【3】手動重寫LinearLayout的onInterceptTouchEvent()方法,使其返回true,攔截事件,再重寫onTouchEvent()方法,返回true,程序輸出:

事件傳遞示意圖:

(1)這一系列的傳遞流程都是dispatchTouchEvent()方法來控制的,如果不人為地干預,事件將由上自下依次傳遞(因為默認是返回false不會攔截的),傳遞到最底層的View,就由它的onTouchEvent()方法來處理事件,若處理成功返回true,若處理失敗返回false,事件依次向上傳遞,每個View都調用自己的onTouchEvent()方法來處理事件,若處理成功就終止傳遞,若處理失敗就繼續向上傳遞。 (2)經過人為的干預,若在向下傳遞的過程中被攔截了,即onInterceptTouchEvent()方法返回true,則事件將停止向下傳遞,直接由當前的onTouchEvent()方法來處理,若處理成功則OK,若處理不成功,則事件會向上傳遞。 (3)另外,dispatchTouchEvent()方法中還有“記憶”的功能,如果第一次事件向下傳遞到某View,它把事件繼續傳遞交給它的子View,它會記錄該事件是否被它下面的View給處理成功了,(怎么能知道呢?如果該事件會再次被向上傳遞到我這里來由我的onTouchEvent()來處理,那就說明下面的View都沒能成功處理該事件);當第二次事件向下傳遞到該View,該View的dispatchTouchEvent()方法機會判斷,若上次的事件由下面的view成功處理了,那么這次的事件就繼續交給下面的來處理,若上次的事件沒有被下面的處理成功,那么這次的事件就不會向下傳遞了,該View直接調用自己的onTouchEvent()方法來處理該事件。 (4)“記憶”功能的信息只在一系列事件完成之前有效,如從ACTION_DOWN事件開始,直到后續事件ACTION_MOVE,ACTION_UP結束后,“記憶”的信息就會清除。也就是說如果某View處理ACTION_DOWN事件失敗了(onTouchEvent()返回false),那么后續的ACTION_MOVE,ACTION_UP等事件就不會再傳遞到該View了,由其父View自己來處理。在下一次發生ACTION_DOWN事件的時候,還是會傳遞到該View的。 Demo源碼下載:http://download.csdn.net/detail/morgan_xww/5781199 [java] view plain copy PRint? public class MyActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("d", "【總統】任務<" + Util.actionToString(ev.getAction()) + "> : 需要分派"); return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { boolean bo = false; Log.d("d", "【總統】任務<" + Util.actionToString(ev.getAction()) + "> : 下面都解決不了,下次再也不能靠你們了,哼…只能自己嘗試一下啦。能解決?" + bo); return bo; }

}

[java] view plain copy print? public class MyFrameLayout extends FrameLayout { public MyFrameLayout(Context context, AttributeSet attrs){ super(context, attrs); }

@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("d", "【省長】任務<" + Util.actionToString(ev.getAction()) + "> : 需要分派"); return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean bo = false; Log.d("d", "【省長】任務<" + Util.actionToString(ev.getAction()) + "> : 攔截嗎?" + bo); return bo; } @Override public boolean onTouchEvent(MotionEvent ev) { boolean bo = false; Log.d("d", "【省長】任務<" + Util.actionToString(ev.getAction()) + "> : 市長是個廢物,下次再也不找你了,我自己來嘗試一下。能解決?" + bo); return bo; }

}

[java] view plain copy print? public class MyLinearLayout extends LinearLayout{

public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("d", "【市長】任務<" + Util.actionToString(ev.getAction()) + "> : 需要分派"); return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean bo = false; Log.d("d", "【市長】任務<" + Util.actionToString(ev.getAction()) + "> : 攔截嗎?" + bo); return bo; } @Override public boolean onTouchEvent(MotionEvent ev) { boolean bo = false; Log.d("d", "【市長】任務<" + Util.actionToString(ev.getAction()) + "> : 農民真沒用,下次再也不找你了,我自己來嘗試一下。能解決?" + bo); return bo; }

}

[java] view plain copy print? public class MyTextView extends TextView { public MyTextView(Context context, AttributeSet attrs){ super(context, attrs); }

@Override public boolean dispatchTouchEvent(MotionEvent ev){ Log.d("d", "【農民】任務<" + Util.actionToString(ev.getAction()) + "> : 需要分派,我下面沒人了,怎么辦?自己干吧"); return super.dispatchTouchEvent(ev); } di@Override public boolean onTouchEvent(MotionEvent ev){ boolean bo = true; Log.d("d", "【農民】任務<" + Util.actionToString(ev.getAction()) + "> : 自己動手,埋頭苦干。能解決?" + bo); return bo; }

}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人妇女免费播放久久久| 精品久久久久久久久久久久久| 国产va免费精品高清在线| 亚洲精品国产综合久久| 欧美放荡办公室videos4k| 欧美另类交人妖| 国产精品久久久久免费a∨大胸| 欧美视频中文在线看| 国产亚洲精品综合一区91| 成人性生交xxxxx网站| 久久av红桃一区二区小说| 国产精品美腿一区在线看| 日韩精品在线观| 欧美激情按摩在线| 在线观看国产精品日韩av| 91精品久久久久久久久久入口| 国产美女高潮久久白浆| 日韩视频一区在线| 中文字幕亚洲欧美| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩av黄色在线观看| 欧美久久久精品| 国产一区二区三区中文| 一区二区三区日韩在线| 国产精品入口免费视频一| www.久久草.com| 国产一区二区三区日韩欧美| 久久久亚洲影院你懂的| 色噜噜久久综合伊人一本| 亚洲国产高清高潮精品美女| 久久精品国产69国产精品亚洲| 亚洲人在线观看| 亚洲国产精品久久| 久久久久久久国产精品| 成人免费淫片aa视频免费| 97精品国产97久久久久久| 欧美激情亚洲激情| 欧美与欧洲交xxxx免费观看| 岛国av一区二区| 88国产精品欧美一区二区三区| 国产欧美日韩最新| 91在线免费视频| 69久久夜色精品国产7777| 久久天天躁狠狠躁夜夜躁| 精品在线观看国产| 久久久av亚洲男天堂| 成人黄色在线播放| 久久免费视频网| 九九精品在线观看| 黑人巨大精品欧美一区二区三区| 91免费高清视频| 日韩成人在线视频观看| 亚洲bt欧美bt日本bt| 国产成人精品免高潮在线观看| 2019国产精品自在线拍国产不卡| 亚洲精品一区中文字幕乱码| 日韩av大片免费看| 粉嫩av一区二区三区免费野| 国产精品一区二区三区成人| 欧洲成人免费aa| 久久久精品国产| 66m—66摸成人免费视频| 孩xxxx性bbbb欧美| 亚洲国产97在线精品一区| 欧美激情视频在线观看| 国产精品夫妻激情| 亚洲bt天天射| 亚洲字幕一区二区| 日本道色综合久久影院| 最近更新的2019中文字幕| 久久久在线观看| 深夜精品寂寞黄网站在线观看| 国产精品吊钟奶在线| 成人亚洲综合色就1024| 在线观看欧美www| 欧美亚洲成人精品| 国产精品免费小视频| 亚洲国产欧美久久| 欧美性猛交xxxx免费看久久久| 精品国产乱码久久久久久天美| 欧美精品第一页在线播放| 国产日韩av在线| 最近2019中文字幕mv免费看| 欧美日韩在线视频一区二区| 日韩福利伦理影院免费| 97国产真实伦对白精彩视频8| 国产欧美一区二区三区在线| 国产亚洲精品综合一区91| 亚洲国产成人久久| 亚洲精品资源在线| 97久久伊人激情网| 91爱爱小视频k| 久久精品视频播放| 国外视频精品毛片| 九色91av视频| 亚洲天堂男人的天堂| 亚洲最大中文字幕| 免费91麻豆精品国产自产在线观看| 亚洲精品小视频| 久久99久久99精品免观看粉嫩| 一区国产精品视频| 色悠悠国产精品| 亚洲色图第一页| 国产一区视频在线播放| 久久伊人免费视频| 九九热精品视频国产| 日韩影视在线观看| 国内精品美女av在线播放| 在线看国产精品| 在线看国产精品| 在线电影av不卡网址| 成人福利网站在线观看11| 97av在线视频免费播放| 亚洲xxxxx| 欧美精品国产精品日韩精品| 欧美午夜精品久久久久久人妖| 亚洲国产精品成人一区二区| 色琪琪综合男人的天堂aⅴ视频| 97视频在线观看免费| 成人激情在线观看| 国产精品综合不卡av| 96国产粉嫩美女| 日韩精品视频观看| 亚洲精品一区二区网址| 久久久在线视频| 欧美专区在线播放| 日韩在线视频观看正片免费网站| 国语自产精品视频在线看一大j8| 亚洲剧情一区二区| 国产欧美欧洲在线观看| 国产欧美精品va在线观看| 亚洲国产高清福利视频| 91在线色戒在线| 国产精品久久久久久亚洲调教| 国产精品久久久久免费a∨| 久久久久免费视频| 欧美激情xxxx性bbbb| 日韩在线免费观看视频| 亚洲免费中文字幕| 国产精品久久久999| 亚洲一二三在线| 日韩大陆欧美高清视频区| 国产精品免费视频xxxx| 亚洲午夜精品久久久久久久久久久久| 亚洲欧美国产日韩中文字幕| 亚洲精品动漫久久久久| 91精品国产91久久久久久久久| 热99精品只有里视频精品| 欧美另类精品xxxx孕妇| 精品自在线视频| 亚洲激情视频在线播放| 欧美性猛交xxxx乱大交蜜桃| 欧美成人精品不卡视频在线观看| 国产精品一区二区三区久久久| 久久国产精品视频| 亚洲天堂精品在线| 日韩在线视频二区| 久久久综合免费视频| 久久久精品在线观看| 亚洲成人网久久久| 91在线观看欧美日韩| 亚洲一区www| 91精品国产高清久久久久久久久| 97久久久免费福利网址|