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

android onTouchEvent處理機(jī)制總結(jié)(必看)

 更新時(shí)間:2017年04月14日 10:30:31   投稿:jingxian  
下面小編就為大家?guī)硪黄猘ndroid onTouchEvent處理機(jī)制總結(jié)(必看)小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

項(xiàng)目中總會(huì)用到一些觸摸事件,每次使用都是百度各種資料,看各種大神的分析筆記。這次我自己總結(jié)下關(guān)于觸摸事件的一些知識(shí)點(diǎn)。一來可以讓自己對(duì)觸摸事件印象更加深刻,也給以后的項(xiàng)目做一個(gè)參考。最難理解的其實(shí)是onTouchEvent方法。

一、 概述

1.只有view,ViewGroup,Activity 具有事件分發(fā)和消費(fèi)的功能。

2.Activity因?yàn)樯献钕冉佑|到觸摸事件,因此Activity沒有事件攔截方法。即沒有dispatchTouchEvent方法。

3.對(duì)于不能添加子控件的view,不能對(duì)事件進(jìn)行分發(fā)和攔截,它只有onTouchEvent事件。

二、三個(gè)方法

1.public boolean dispatchTouchEvent(MotionEvent ev)

當(dāng)觸摸事件發(fā)生的時(shí)候,首先會(huì)被當(dāng)前的activity進(jìn)行分發(fā),即當(dāng)前activity的dispatchTouchEvent方法會(huì)被執(zhí)行。

這個(gè)時(shí)候,該方法有三種返回的情況:

return false: 表明事件不會(huì)被進(jìn)行分發(fā)。事件會(huì)以冒泡的方式被傳遞給上層的view或activity的onTouchEvent方法進(jìn)行消費(fèi)掉。

return true:表明該時(shí)間已經(jīng)被處理。事件會(huì)被當(dāng)前view或activity的dispatchTouchEvent給消費(fèi)掉。不會(huì)再進(jìn)行傳遞,事件到此結(jié)束。

return super.dispatchTouchEvent(ev):表明該事件將會(huì)被分發(fā)。此時(shí)當(dāng)前View的onIntercepterTouchEvent方法會(huì)捕獲該事件,判斷需不需要進(jìn)行事件的攔截。

2.public boolean onInterceptTouchEvent(MotionEvent ev)    

該方法用戶攔截被傳遞過來的事件,用于判斷被傳遞過來的事件是否需要被當(dāng)前的view進(jìn)行處理。

return false :不對(duì)事件進(jìn)行攔截,放行該事件。事件會(huì)被傳遞到當(dāng)前view的子控件中,由子控件中的dispatchTouchEvent方法進(jìn)行分發(fā)處理。

return true : 攔截該事件,將該事件交給當(dāng)前view的onTouchEvent方法進(jìn)行處理。

return super.inInterceptTouchEvent(ev):默認(rèn)攔截方式,和return true一樣。該事件會(huì)被攔截,將該事件交給當(dāng)前view的onTouchEvent方法進(jìn)行處理。(這里需要有一點(diǎn)說明,當(dāng)有兩個(gè)view。A view中有一個(gè)B view.點(diǎn)擊A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將會(huì)被A進(jìn)行攔截,交給A的onTouchEvent()進(jìn)行處理,如果點(diǎn)擊的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將不會(huì)被攔截,會(huì)被分發(fā)到子控件中) 

3.public boolean onTouchEvent(MotionEvent event)

當(dāng)前的view把事件進(jìn)行了攔截,則事件則會(huì)被傳遞到該方法中

return false:表明沒有消費(fèi)該事件,事件將會(huì)以冒泡的方式一直被傳遞到上層的view或Activity中的onTouchEvent事件處理。如果最上層的view或Activity中的onTouchEvent還是返回false。則該事件將消失。接下來來的一系列事件都將會(huì)直接被上層的onTouchEvent方法捕獲

return true: 表明消費(fèi)了該事件,事件到此結(jié)束。

return super.onTouchEvent(event):默認(rèn)情況,和return false一樣。

驗(yàn)證:

MainActivity FatherView ChildView中幾個(gè)方法都返回super.****TouchEvent(ev)

分析:

1、當(dāng)點(diǎn)擊屏幕。MainActivity 中的dispatchTouchEvent方法先執(zhí)行,打印MainActivity-dispatchTouchEvent-->ACTION_DOWN

2、因?yàn)榉祷氐氖莝uper.dispatchTouchEvent(ev),所以事件ev將會(huì)被分發(fā),但是MainActivity中沒有onInterceptTouchEvent()方法,所以事件被傳遞到FatherView中的dispatchTouchEvent方法.打印FatherView-dispatchTouchEvent-->ACTION_DOWN

3、在FatherView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件會(huì)被分發(fā)。FatherView中的onInterceptTouchEven()中的方法被執(zhí)行。打印FatherView-onInterceptTouchEven-->ACTION_DOWN

4、FatherView中的onInterceptTouchEven()返回的是super.onInterceptTouchEvent(ev)。在這里,(1)如果點(diǎn)擊的是屏幕中的ChildView。事件將不會(huì)被攔截,會(huì)被傳遞到ChildView中的dispatchTouchEvent方法中。(2)如果點(diǎn)擊的值FatherView則事件將會(huì)被攔截。FatherView中的onTouchEvent()方法將被執(zhí)行。以(1)為例,將打印ChildView-dispatchTouchEvent-->ACTION_DOWN。

5、ChildView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件會(huì)被分發(fā)。打印ChildView-onInterceptTouchEvent-->ACTION_DOWN。

6、此時(shí)ChildView中onInterceptTouchEvent返回的是super.onInterceptTouchEvent(ev),,而且已經(jīng)沒有子控件了,所以事件將被攔截。打印ChildView-onTouchEvent-->ACTION_DOWN。

7、在childView中onTouchEvent()返回額是super.onTouchEvent(ev)。事件將不會(huì)被消耗,將以冒泡的方式傳遞到上層空間中的onTouchEvent(),此處上層空間中的onTouchEvent返回的都是super.onTouchEvent(ev)。所以講一次打印 Father-onTouchEvent-->ACTION_DOWN。 MainActivty-onTouchEvent-->ACTION_DOWN。

8、之后的事件動(dòng)作,將不再被MainActivity分發(fā)到子view,直接被MainActivty中的onTouchEvent處理消耗。打印MainActivity-dispatchTouchEvent-->ACTION_UP,MainActivty-onTouchEvent-->ACTION_UP

MainActivity-dispatchTouchEvent-->ACTION_DOWN
FatherView-dispatchTouchEvent-->ACTION_DOWN
FatherView-onInterceptTouchEven-->ACTION_DOWN
ChildView-dispatchTouchEvent-->ACTION_DOWN
ChildView-onInterceptTouchEvent-->ACTION_DOWN。
ChildView-onTouchEvent-->ACTION_DOWN
Father-onTouchEvent-->ACTION_DOWN。 
MainActivty-onTouchEvent-->ACTION_DOWN
MainActivity-dispatchTouchEvent-->ACTION_UP,
MainActivty-onTouchEvent-->ACTION_UP

代碼

MainActivity.java

public class MainActivity extends Activity {
 
  private static final String TAG = "MainActivity";
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate( savedInstanceState);
   setContentView(R.layout. activity_main);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   Log. i(TAG, "activity-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "activity-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
FatherView.java
public class FatherView extends LinearLayout {
  private static final String TAG = "MainActivity";
 
  public FatherView(Context context) {
   super( context);
 
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Father-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
ChildView.java
public class ChildView extends LinearLayout {
 
  private static final String TAG = "MainActivity";
 
  public ChildView(Context context) {
   super( context);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Child-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width= "match_parent"
 android:layout_height= "match_parent"
 tools:context="${relativePackage}.${activityClass}" >
 
 <com.ethanlbb.toucheventtest.FatherView
  android:layout_width= "match_parent"
  android:layout_height= "match_parent"
  android:background= "@android:color/holo_blue_dark"
  android:gravity= "center" >
 
  <com.ethanlbb.toucheventtest.ChildView
   android:layout_width= "200dp"
   android:layout_height= "200dp"
   android:layout_gravity= "center"
   android:background= "#0000ff" >
  </com.ethanlbb.toucheventtest.ChildView >
 </com.ethanlbb.toucheventtest.FatherView >
 
</RelativeLayout>

以上這篇android onTouchEvent處理機(jī)制總結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android9.0 靜默安裝源碼的實(shí)現(xiàn)

    Android9.0 靜默安裝源碼的實(shí)現(xiàn)

    這篇文章主要介紹了Android9.0 靜默安裝源碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Flutter SystemChrome使用方法詳解

    Flutter SystemChrome使用方法詳解

    這篇文章主要為大家介紹了Flutter SystemChrome使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求

    Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求

    這篇文章主要為大家詳細(xì)介紹了Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Android編程之簡(jiǎn)單計(jì)時(shí)器實(shí)現(xiàn)方法

    Android編程之簡(jiǎn)單計(jì)時(shí)器實(shí)現(xiàn)方法

    這篇文章主要介紹了Android編程之簡(jiǎn)單計(jì)時(shí)器實(shí)現(xiàn)方法,涉及Android開發(fā)中ContextMenu及Chronometer的相關(guān)使用技巧,需要的朋友可以參考下
    2016-01-01
  • Android如何實(shí)現(xiàn)動(dòng)態(tài)滾動(dòng)波形圖(心電圖)功能

    Android如何實(shí)現(xiàn)動(dòng)態(tài)滾動(dòng)波形圖(心電圖)功能

    這篇文章主要介紹了Android如何實(shí)現(xiàn)動(dòng)態(tài)滾動(dòng)波形圖(心電圖)功能,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下
    2021-03-03
  • Android中如何實(shí)現(xiàn)清空搜索框的文字

    Android中如何實(shí)現(xiàn)清空搜索框的文字

    本文主要介紹Android中實(shí)現(xiàn)清空搜索框的文字的方法。項(xiàng)目中的有關(guān)搜索的地方,加上清空文字的功能,目的是為了增加用戶體驗(yàn),使用戶刪除文本更加快捷。需要的朋友一起來看下吧
    2016-12-12
  • Android中BaseAdapter用法示例

    Android中BaseAdapter用法示例

    這篇文章主要介紹了Android中BaseAdapter用法,分析了BaseAdapter的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-08-08
  • Android中ContentProvider和ContentResolver詳解

    Android中ContentProvider和ContentResolver詳解

    這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android日期選擇控件使用詳解

    Android日期選擇控件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Android日期選擇控件的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • android重力感應(yīng)開發(fā)之微信搖一搖功能

    android重力感應(yīng)開發(fā)之微信搖一搖功能

    這篇文章主要為大家詳細(xì)介紹了android重力感應(yīng)開發(fā)之微信搖一搖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

保亭| 孟村| 山阳县| 贵溪市| 湖南省| 桃源县| 大连市| 宜良县| 平远县| 广宗县| 威信县| 汉川市| 库尔勒市| 玉门市| 名山县| 集安市| 高唐县| 昆明市| 行唐县| 富锦市| 云和县| 水城县| 应用必备| 义马市| 钟山县| 兴业县| 镇远县| 阿拉尔市| 凤山县| 东乡县| 黄平县| 普安县| 宝兴县| 永靖县| 萨嘎县| 建水县| 新化县| 怀宁县| 慈溪市| 张北县| 姚安县|