电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android Touch事件傳遞機制通俗講解

瀏覽:4日期:2022-09-27 15:41:11

在講正題之前我們講一段有關任務傳遞的小故事,拋磚迎玉下:

話說一家軟件公司,來一個任務,分派給了開發(fā)經(jīng)理去完成:

開發(fā)經(jīng)理拿到,看了一下,感覺好簡單,于是

開發(fā)經(jīng)理:分派給了開發(fā)組長

開發(fā)組長:分派給了自己組員(程序員)

程序員:分派給了自己帶的實習生。

實習生:好苦逼,無法分派,怎么辦啊?只能自己干了

但是實習生能不能做好,有兩種情況了。

情況一:

實習生:經(jīng)過一段時間的研究,琢磨,熬夜,奮斗,死敲,皇天不負有心人啊,完成了。

后來又來一個類似的任務,也按著這樣傳遞下去了(開發(fā)經(jīng)理->開發(fā)組長->程序員->實習生),又有實習生完成了。

情況二:

實習生:經(jīng)過一段時間的研究,琢磨,就是毫無頭緒,無法完成,只能求教師傅(程序員)了。

程序員:啊,我怎么沒留意就給實習生搞了,這任務好難啊,自己研究下,也沒有頭緒,沒辦法只能請求組長了。

開發(fā)組長:這任務不難啊,怎么我底下的人都不會了,沒辦法,只能自己搞了,經(jīng)過,一段時間,完成了,感想,以后要是又有跟這個很類似的任務,我就自己弄了,不給他們弄了。

后來又來一個類似的任務,傳遞是這樣的

開發(fā)經(jīng)理:分派給開發(fā)組長

開發(fā)組長:啊,又是跟著上一個很類似的任務,我自己弄吧,沒過多久也完成了!

PS:以上就是一個任務傳遞的過程。上級一開始總會想把任務分派給自己的下屬去弄,然后任務一步一步去傳遞下去,最后由一個人去完成他,當然傳遞下去,最底下人不會,也會一步一步的回滾,又他上級去完成,如果又有一個類似的任務,那個節(jié)點不會的人就不會再傳遞給他,給他也不會弄。當然實現(xiàn)中,這些任務的傳遞也可能被分派人去攔截,比如說,開發(fā)組長本打算分派給程序員,突然他不想傳遞了,就半路攔截了下來。

而在我們android Touch事件傳遞機制跟這個很類似,思想差不多,有句話說,設計來源于生活。跟Touch事件有關的處理方法主要由三個:

//分派事件public boolean dispatchTouchEvent(MotionEvent ev)//攔截事件 public boolean onInterceptTouchEvent(MotionEvent ev)//處理事件public boolean onTouchEvent(MotionEvent event)

用他們的時候,我們只需要重寫一下,即可操作,這三個方法主要在三種類被調(diào)用,那三種類呢?

基類例子類擁有的方法繼承Activity(activity類)MainActivity(因項目而異)

dispatchTouchEvent,onTouchEvent繼承ViewGroup(View容器)RelativeLayout,F(xiàn)rameLayout,LinearLayout,AbsoluteLayout,ListView,ScrollView…

dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent繼承View(View控件)Button,EditText,TextView,ImageView….

dispatchTouchEvent,onTouchEvent

而這三個方法的含義是什么呢?

事件含義

dispatchTouchEvent用來分派事件。其中調(diào)用了onInterceptTouchEvent()和onTouchEvent(),一般不重寫該方法

onInterceptTouchEvent用來攔截事件。ViewGroup類中的源碼實現(xiàn)就是{return false;}表示不攔截該事件,事件將向下傳遞(傳遞給其子View);若手動重寫該方法,使其返回true則表示攔截,事件將終止向下傳遞,事件由當前ViewGroup類來處理,就是調(diào)用該類的onTouchEvent()方法

onTouchEvent用來處理事件。返回true則表示該View能處理該事件,事件將終止向上傳遞(傳遞給其父View);返回false表示不能處理,則把事件傳遞給其父View的onTouchEvent()方法來處理

根據(jù)上面的小故事,我們用代碼去實現(xiàn)一下:

我新建了四個類:MainActivity(開發(fā)經(jīng)理),F(xiàn)irstFrameLayout(開發(fā)組長),SecondRelativeLayout(程序員),ThirdTextView(實習生)

在界面的層次關系如下圖:

Android Touch事件傳遞機制通俗講解

我就好比我們前面的故事情況一,情況二那么模擬下:

情況一

首先我們按照上面的故事情況一那樣,任務一級一級傳遞下去(將viewgroup的類的onInterceptTouchEvent都返回false),然后事件就會一直傳遞到,ThirdTextview,最后,我們把它的onTouchEvent返回ture(含義是實習生處理成功了)。我們點擊藍色區(qū)域。我們看下日志。

Android Touch事件傳遞機制通俗講解

情況二

首先我們還是一級級傳遞下去(將viewgroup的類的onInterceptTouchEvent都返回false),然后是傳遞到ThirdTextview,我們將它的onTouchEvent返回false(含義是實習生處理失敗了),再講SecondRelativeLayout的onTouchEvent返回false(含義是程序員處理失敗了),最后講FirstFrameLayout的onTouchEvent返回true(含義是組長處理成功了)。我們點擊藍色區(qū)域。我們看下日志,如下圖。

Android Touch事件傳遞機制通俗講解

注:上面兩種情況的日志圖,紅色框代表第一個任務,黃色框代表第二個類似的任務。根據(jù)上圖日志,我們畫下傳遞圖:

情況一事件傳遞圖:

Android Touch事件傳遞機制通俗講解

情況二事件傳遞圖:

Android Touch事件傳遞機制通俗講解

從上面兩張事件傳遞圖我們的出來一些結(jié)論:

1.事件是先有dispatchTouchEvent分派給下一級

2.要經(jīng)過onInterceptTouchEvent是否需要攔截,不攔截傳遞給下一級,最終傳遞給view控件,

3.onTouchEvent方法中,在處理事件中,如果返回True,則表示能處理,傳遞將會終止。反著,不能,如果不能的話,這會返回上一級的onTouchEvent方法中,如果還是false,會一直到到上一層的onTouchEvent方法中。

好奇的我們會發(fā)現(xiàn)一個問題:圖二中的黃色線,沒有像紅色線那樣,先傳遞到最底層,然后再回滾回去,這是為什么呢?

答:就如我們故事中,他都知道了,底下人都不會去做了,那么他干嘛還分派給他呢,他就會自己做了,直接給onTouchEvent ,這就是事件傳遞中的“記憶”功能。我們是手指點擊藍色區(qū)域,Touch事件有兩個,第一個ACTION_DOWN,第二個ACTION_UP,第一個ACTION_DOWN事件向下傳遞到某View,它把事件繼續(xù)傳遞交給它的子View,它會記錄該事件是否被它下面的View給處理成功了,(怎么能知道呢?如果該事件會再次被向上傳遞到我這里來由我的onTouchEvent來處理,那就說明下面的View都沒能成功處理該事件);當?shù)诙€ACTION_UP事件向下傳遞到該View,該View的dispatchTouchEvent方法機會判斷,若上次的事件由下面的view成功處理了,那么這次的事件就繼續(xù)交給下面的來處理,若上次的事件沒有被下面的處理成功,那么這次的事件就不會向下傳遞了,該View直接調(diào)用自己的onTouchEvent方法來處理該事件。

PS:關于這“記憶”功能的信息只在一系列事件完成之前有效,也就是從ACTION_DOWN事件開始,直到后續(xù)事件ACTION_MOVE,ACTION_UP結(jié)束后,“記憶”的信息就會清除。也就是說如果某View處理ACTION_DOWN事件失敗了(onTouchEvent()返回false),那么后續(xù)的ACTION_MOVE,ACTION_UP等事件就不會再傳遞到該View了,由其父View自己來處理。在下一次發(fā)生ACTION_DOWN事件的時候,還是會傳遞到該View的。

補充說明:

-》若在向下傳遞的過程中被攔截了,即onInterceptTouchEvent方法返回true,則事件將停止向下傳遞,直接由當前的onTouchEvent方法來處理,若處理成功則OK,若處理不成功,則事件會向上傳遞。

謝謝收看。

實例代碼:http://download.csdn.net/detail/chenjie_920/8398413

標簽: Android
相關文章:
主站蜘蛛池模板: 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | 电动不锈钢套筒阀-球面偏置气动钟阀-三通换向阀止回阀-永嘉鸿宇阀门有限公司 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 护栏打桩机-打桩机厂家-恒新重工 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 浙江自考_浙江自学考试网 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 【北京写字楼出租_写字楼租赁_办公室出租网/出售】-远行地产官网 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 撕碎机,撕破机,双轴破碎机-大件垃圾破碎机厂家 | 南京欧陆电气股份有限公司-风力发电机官网 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 |