最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一.Android View框架提供了3個對事件的主要操作概念。

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

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

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

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

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

 true-事件被以該節(jié)點為根節(jié)點的View樹成功處理,此時該事件就算是處理完成了,事件不會再向上返還給View的父節(jié)點(把事件分發(fā)過來的那個節(jié)點)。

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

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

true-當前ViewGroup(因為View中沒有該方法,而沒有child的VIew也不需要有攔截機制)希望該事件不再傳遞給其child,而是希望自己處理。

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

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

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

false-表示該View沒有成功處理該事件,那么它的parent會有機會來處理該事件(parent標記為事件序列接受者,parent 的 onTouchEvent 在 Down 事件時返回true)。

三.源代碼分析

View:

1、dispatchTouchEvent:

/** 把事件分發(fā)到目標對象,因為這里是View對象,默認不含有child,所以這里他會把事件分發(fā)給自己 */

public boolean dispatchTouchEvent(MotionEvent event);

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

ViewGroup:

1、onInterceptTouchEvent

/** 默認實現是返回false,也就是默認不攔截任何事件 */

public boolean onInterceptTouchEvent(MotionEvent ev);

2、dispatchTouchEvent

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

public boolean dispatchTouchEvent(MotionEvent ev);

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

3、requestDisallowInterceptTouchEvent

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

public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • Flutter應用程序實現隱私屏幕示例解析

    Flutter應用程序實現隱私屏幕示例解析

    這篇文章主要為大家介紹了Flutter應用程序實現隱私屏幕示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Android應用中使用DOM方式解析XML格式數據的基本方法

    Android應用中使用DOM方式解析XML格式數據的基本方法

    這篇文章主要介紹了Android應用中使用DOM方式解析XML格式數據的基本方法,值得注意的是DOM方式解析的效率并不高,在數據量大的時候并不推薦使用,需要的朋友可以參考下
    2016-04-04
  • android 仿微信demo——微信主界面實現

    android 仿微信demo——微信主界面實現

    本系列文章主要介紹了微信小程序-閱讀小程序實例(demo),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助
    2021-06-06
  • Android仿微信群聊頭像

    Android仿微信群聊頭像

    這篇文章主要為大家介紹了Android仿微信群聊頭像的相關資料,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android滑動優(yōu)化高仿QQ6.0側滑菜單(滑動優(yōu)化)

    Android滑動優(yōu)化高仿QQ6.0側滑菜單(滑動優(yōu)化)

    之前的實現只是簡單的可以顯示和隱藏左側的菜單,但是特別生硬,而且沒有任何平滑的趨勢,那么今天就來優(yōu)化一下吧,加上平滑效果,而且可以根據手勢滑動的方向來判斷是否是顯示和隱藏
    2016-02-02
  • Android布局耗時監(jiān)測的三種實現方式

    Android布局耗時監(jiān)測的三種實現方式

    在Android應用開發(fā)中,性能優(yōu)化是一個至關重要的方面,為了更好地監(jiān)測布局渲染的耗時,我們需要一種可靠的實現方案,本文將介紹三種針對Android布局耗時監(jiān)測的實現方案,幫助開發(fā)者及時發(fā)現并解決布局性能問題,需要的朋友可以參考下
    2024-03-03
  • flutter 自定義card陰影效果及card使用

    flutter 自定義card陰影效果及card使用

    這篇文章主要介紹了flutter 自定義card陰影效果及card使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android權限操作之uses-permission詳解

    Android權限操作之uses-permission詳解

    這篇文章主要介紹了Android權限操作之uses-permission,較為詳細的分析了uses-permission常見權限操作類型與功能,需要的朋友可以參考下
    2016-10-10
  • Android編程之軟鍵盤的隱藏顯示實例詳解

    Android編程之軟鍵盤的隱藏顯示實例詳解

    這篇文章主要介紹了Android編程之軟鍵盤的隱藏顯示,結合實例形式詳細分析了Android編程中軟鍵盤的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • Android入門之使用RecyclerView完美實現瀑布流界面詳解

    Android入門之使用RecyclerView完美實現瀑布流界面詳解

    網上充滿著不完善的基于RecyclerView的瀑布流實現,要么根本是錯的、要么就是只知其一不知其二。本文就來用RecyclerView完美實現瀑布流界面,希望大家有所幫助
    2023-02-02

最新評論

石首市| 乌什县| 宜黄县| 合阳县| 临清市| 喀什市| 长岭县| 克什克腾旗| 泰州市| 汨罗市| 仁怀市| 安图县| 兴隆县| 湾仔区| 保德县| 娱乐| 周宁县| 石门县| 富宁县| 武宣县| 开远市| 石柱| 晋州市| 西平县| 西充县| 赤城县| 类乌齐县| 满洲里市| 土默特左旗| 闽侯县| 东至县| 辽宁省| 镇坪县| 峨山| 新泰市| 出国| 荥经县| 开阳县| 永吉县| 临泉县| 中江县|