欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android View的事件分發(fā)機(jī)制

 更新時(shí)間:2017年03月13日 10:47:58   作者:ganchuanpu  
本文主要介紹了Android View的事件分發(fā)機(jī)制。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧

一.Android View框架提供了3個(gè)對(duì)事件的主要操作概念。

1、事件的分發(fā)機(jī)制,dispatchTouchEvent。主要是parent根據(jù)觸摸事件的產(chǎn)生位置,以及child是否愿意負(fù)責(zé)處理該系列事件等狀態(tài),向其child分發(fā)事件的機(jī)制。

2、事件的攔截機(jī)制,onInterceptTouchEvent。主要是parent根據(jù)它內(nèi)部的狀態(tài)、或者child的狀態(tài),來(lái)把事件攔截下來(lái),阻止其進(jìn)一步傳遞到child的機(jī)制。

3、事件的處理機(jī)制,onTouchEvent。主要是事件序列的接受者(可以是一個(gè)View或者ViewGroup),對(duì)事件作出處理,并且向其parent傳遞處理結(jié)果的機(jī)制。

二.在Java中,傳遞計(jì)算結(jié)果,有很多種途徑,這里采用的是一種適用于同步調(diào)用的方法,返回值的方法。每個(gè)機(jī)制都使用boolean類型作為其返回值,那么每個(gè)機(jī)制的每個(gè)返回值是什么含義呢。

1、事件的分發(fā)機(jī)制,dispatchTouchEvent。

 true-事件被以該節(jié)點(diǎn)為根節(jié)點(diǎn)的View樹成功處理,此時(shí)該事件就算是處理完成了,事件不會(huì)再向上返還給View的父節(jié)點(diǎn)(把事件分發(fā)過(guò)來(lái)的那個(gè)節(jié)點(diǎn))。

false-以該節(jié)點(diǎn)為根節(jié)點(diǎn)的View樹種,沒有一個(gè)View(包括該View)成功處理了此事件,所以事件會(huì)向上返還給View的父節(jié)點(diǎn)(把事件分發(fā)過(guò)來(lái)的那個(gè)節(jié)點(diǎn))。

2、事件的攔截機(jī)制,onInterceptTouchEvent。主要是parent根據(jù)它內(nèi)部的狀態(tài)、或者child的狀態(tài),來(lái)把事件攔截下來(lái),阻止其進(jìn)一步傳遞到child的機(jī)制。

true-當(dāng)前ViewGroup(因?yàn)閂iew中沒有該方法,而沒有child的VIew也不需要有攔截機(jī)制)希望該事件不再傳遞給其child,而是希望自己處理。

false-當(dāng)前ViewGroup不準(zhǔn)備攔截該事件,事件正常向下分發(fā)給其child。

3、事件的處理機(jī)制,onTouchEvent。主要是事件序列的接受者(可以是一個(gè)View或者ViewGroup),對(duì)事件作出處理,并且向其parent傳遞處理結(jié)果的機(jī)制。

true-表示該View成功處理了該事件,該處理結(jié)果會(huì)向上通知給其parent。

false-表示該View沒有成功處理該事件,那么它的parent會(huì)有機(jī)會(huì)來(lái)處理該事件(parent標(biāo)記為事件序列接受者,parent 的 onTouchEvent 在 Down 事件時(shí)返回true)。

三.源代碼分析

View:

1、dispatchTouchEvent:

/** 把事件分發(fā)到目標(biāo)對(duì)象,因?yàn)檫@里是View對(duì)象,默認(rèn)不含有child,所以這里他會(huì)把事件分發(fā)給自己 */

public boolean dispatchTouchEvent(MotionEvent event);

public boolean dispatchTouchEvent(MotionEvent event){ 
  boolean result = false; 
  //如果有事件監(jiān)聽器,先讓監(jiān)聽器處理事件。 
  if (mOnTouchListener.onTouch(event)) { 
    //如果監(jiān)聽器成功處理了該事件,處理結(jié)果設(shè)置為true。 
    result = true; 
  } 
  //如果沒有監(jiān)聽器,就調(diào)用自身的onTouchEvent方法來(lái)處理事件。 
  if (!resutlt && onTouchEvent(event)) { 
    //如果自身的onTouchEvent成功處理事件,處理結(jié)果設(shè)置為true。 
    result = true; 
  } 
  return result; 
} 

ViewGroup:

1、onInterceptTouchEvent

/** 默認(rèn)實(shí)現(xiàn)是返回false,也就是默認(rèn)不攔截任何事件 */

public boolean onInterceptTouchEvent(MotionEvent ev);

2、dispatchTouchEvent

/** 根據(jù)內(nèi)部攔截狀態(tài),向其child或者自己分發(fā)事件 */

public boolean dispatchTouchEvent(MotionEvent ev);

public boolean dispatchTouchEvent(MotionEvent ev) { 
 if (ACTION_DOWN事件 || 沒有事件處理對(duì)象) { 
  if (允許攔截事件,該標(biāo)志位由child調(diào)用requestDisallowInterceptTouchEvent<span style="font-family:微軟雅黑;font-size:14px;">設(shè)置</span>) { 
   //查詢攔截機(jī)制的結(jié)果,根據(jù)該結(jié)果來(lái)判斷是否需要攔截 
   intercepted = onInterceptTouchEvent(ev); 
  } else { 
   //不允許攔截,那么不攔截 
   intercepted = false; 
  } 
 } else { 
  //不是DOWN,并且有處理對(duì)象,允許攔截,中斷事件傳遞 
  intercepted = true; 
 } 
 if (不取消 && 不攔截) { 
  if (ACTION_DOWN) { //找尋接收事件序列的對(duì)象,其他事件不需要再計(jì)算事件產(chǎn)生對(duì)象,試想一下滑動(dòng)一個(gè)ListView,當(dāng)手指滑動(dòng)出ListView的范圍時(shí),依然還是ListView響應(yīng)后續(xù)事件。 
   for (遍歷所有childView) { 
    if (觸摸點(diǎn)不在childView內(nèi)部) { 
     continue; 
    } 
    if (childView.dispatchTouchEvent(event)) { 
     保存處理該事件的View,后續(xù)事件直接傳遞到該View,不要重新計(jì)算; 
    } 
   } 
  } 
  if (還沒有事件處理對(duì)象) { 
   //當(dāng)前View樹中沒找到合適的child處理對(duì)象,把事件給自己處理,View.dispatchTouchEvent()就是把事件分發(fā)給自己 
   super.dispatchTouchEvent(event); 
  } else { 
   //傳遞給child 
   childView.dispatchTouchEvent(event); 
  } 
 } else if (攔截) { 
  //攔截事件,把事件給自己處理,View.dispatchTouchEvent()就是把事件分發(fā)給自己 
  super.dispatchTouchEvent(event); 
 } 
 return 處理結(jié)果; 
} 

3、requestDisallowInterceptTouchEvent

/** 干澀parent的事件分發(fā)機(jī)制,通知parent,是否攔截后續(xù)事件,如果設(shè)置為true,parent就不會(huì)攔截該事件,不管什么狀態(tài)。設(shè)置為false,parent走正常的攔截流程 */

public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
 if (已經(jīng)是當(dāng)前要設(shè)置的狀態(tài)) { 
  // 已經(jīng)處于這個(gè)狀態(tài), 假設(shè)我們的parent也是這個(gè)狀態(tài) 
  return; 
 } 
 設(shè)置該狀態(tài); 
 // 傳遞給parent 
 if (有父容器) { 
  設(shè)置父容器的攔截狀態(tài); 
 } 
} 

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • android自定義View實(shí)現(xiàn)圓環(huán)顏色選擇器

    android自定義View實(shí)現(xiàn)圓環(huán)顏色選擇器

    這篇文章主要介紹了android自定義View實(shí)現(xiàn)圓環(huán)顏色選擇器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)寬視圖通知欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android?Studio實(shí)現(xiàn)智能聊天

    Android?Studio實(shí)現(xiàn)智能聊天

    這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)智能聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Kotlin泛型的使用介紹

    Kotlin泛型的使用介紹

    泛型,即?"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。與?Java?一樣,Kotlin?也提供泛型,為類型安全提供保證,消除類型強(qiáng)轉(zhuǎn)的煩惱
    2022-09-09
  • Android應(yīng)用隱私合規(guī)檢測(cè)實(shí)現(xiàn)方案詳解

    Android應(yīng)用隱私合規(guī)檢測(cè)實(shí)現(xiàn)方案詳解

    這篇文章主要介紹了Android應(yīng)用隱私合規(guī)檢測(cè)實(shí)現(xiàn)方案,我們需要做的就是提前檢測(cè)好自己的應(yīng)用是否存在隱私合規(guī)問(wèn)題,及時(shí)整改過(guò)來(lái),下面提供Xposed Hook思路去檢測(cè)隱私合規(guī)問(wèn)題,建議有Xposed基礎(chǔ)的童鞋閱讀,需要的朋友可以參考下
    2022-07-07
  • Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼

    Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼

    這篇文章主要介紹了Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Android之日期及時(shí)間選擇對(duì)話框用法實(shí)例分析

    Android之日期及時(shí)間選擇對(duì)話框用法實(shí)例分析

    這篇文章主要介紹了Android之日期及時(shí)間選擇對(duì)話框用法,以實(shí)例形式較為詳細(xì)的分析了Android創(chuàng)建日期及時(shí)間選擇對(duì)話框的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Android中Viewpager禁止滑動(dòng)的實(shí)現(xiàn)

    Android中Viewpager禁止滑動(dòng)的實(shí)現(xiàn)

    有時(shí)候在開發(fā)中會(huì)遇到一些特別的要求,如在ViewPager中嵌入ListView,或者再嵌入一個(gè)ViewPager,那么在滑動(dòng)的時(shí)候就會(huì)造成被嵌入的XXView不能滑動(dòng)了,那么就把最外層的ViewPager禁止滑動(dòng)吧,本文就介紹了Android中Viewpager禁止滑動(dòng)的實(shí)現(xiàn)方法,需要的朋友可以參考。
    2017-05-05
  • Android模擬器實(shí)現(xiàn)手機(jī)添加文件到sd卡的方法

    Android模擬器實(shí)現(xiàn)手機(jī)添加文件到sd卡的方法

    這篇文章主要介紹了Android模擬器實(shí)現(xiàn)手機(jī)添加文件到sd卡的方法,詳細(xì)分析了Android模擬器添加文件到sd卡的步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • Android中使用socket使底層和framework通信的實(shí)現(xiàn)方法

    Android中使用socket使底層和framework通信的實(shí)現(xiàn)方法

    native和framework的通信是通過(guò)jni,但是這一般只是framework調(diào)用native,native如果有消息要怎樣通知上層 呢?android中GSP模塊提供一種解決思路,但是實(shí)現(xiàn)有些復(fù)雜,這里介紹一種使用socket通信的方法可以使native和framework自由通信,感興趣的朋友一起看看吧
    2016-11-11

最新評(píng)論