国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android觸摸事件傳遞圖解

2019-12-12 04:09:34
字體:
來源:轉載
供稿:網友

本博文講解流程

TouchEvent相關事件簡介
流程圖分解講解
總結與歸納

一.TouchEvent相關事件簡介

 android TouchEvent相關事件有
 1 dispatchTouchEvent 這個方法用來分發TouchEvent
 2 onInterceptTouchEvent 這個方法用來攔截TouchEvent
 3 onTouchEvent 方法用來處理TouchEvent

比較特殊一點的是onInterceptTouchEvent 事件,在activity中和view中是沒有這個這個事件的,因為activity本身只是一個容器或者載體,不存在對事件攔截,而view本身就是一個事件的最小單元,或最小子類,沒有可以攔截的子類事件,所以他們是沒有onInterceptTouchEvent事件,只有dispatchTouchEvent和onTouchEvent事件。

二.流程圖分解講解

為了更好的理解觸摸事件的整個傳遞機制我根據事件傳遞繪制了一張流程圖,來幫助大家理解。![這里寫圖片描述]

本圖主要包含三層,即activity viewGroup view,按照事件的傳遞逐級傳遞。有幾個要點要注意,
1.dispatchTouchEvent如果處理了本次事件,

那么他的執行順序是這樣的。這里是viewGroup的dispatchTouchEvent處理了本次事件
2.onTouchEvent 如果子view的TouchEvent沒有處理本次事件,那么該事件會依次向上傳遞,知道有人處理,如果一直傳遞到activity 的onTouchEvent還是沒人處理,默認本次事件結束.

核心代碼

1. Activity

  public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);  }  String tag = "MainActivity";  @Override  public boolean dispatchTouchEvent(MotionEvent event) {    String tag1 = "dispatchTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println(tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println(tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println(tag + tag1 + "ACTION_UP");        break;    }    return super.dispatchTouchEvent(event);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    String tag1 = "onTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println(tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println(tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println(tag + tag1 + "ACTION_UP");        break;    }    return false;  }}

2.viewGroup

public class MyViewGroup extends ViewGroup {  public MyViewGroup(Context context) {    super(context);  }  public MyViewGroup(Context context, AttributeSet attrs) {    super(context, attrs);  }  String tag = "MyViewGroup";  @Override  public boolean dispatchTouchEvent(MotionEvent event) {    String tag1 = "dispatchTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println("------>"+tag +"-->"+ tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println("------>"+tag + tag1 + "ACTION_UP");        break;    }    return super.dispatchTouchEvent(event);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    String tag1 = "onTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println("------>"+tag + tag1 + "ACTION_UP");        break;    }    return super.onTouchEvent(event);  }  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {    String tag1 = "onInterceptTouchEvent";    switch (ev.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println("------>"+tag + tag1 + "ACTION_UP");        break;    }    return super.onInterceptTouchEvent(ev);  }}

3.view

public class MyButton extends Button {  public MyButton(Context context) {    super(context);  }  public MyButton(Context context, AttributeSet attrs) {    super(context, attrs);  }  String tag = "MyButton";  @Override  public boolean dispatchTouchEvent(MotionEvent event) {    String tag1 = "dispatchTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println("------>"+tag + tag1 + "ACTION_UP");        break;    }    return super.dispatchTouchEvent(event);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    String tag1 = "onTouchEvent";    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");        break;      case MotionEvent.ACTION_MOVE:        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");        break;      case MotionEvent.ACTION_UP:        System.out.println("------>"+tag + tag1 + "ACTION_UP");        break;    }    return false;  }}

以上只是部分代碼,但是所有事件都已列出。

總結與歸納

通過以上學習我們應該可以更加深刻的理解事件的傳遞機制,但是在實際的開發過程中可能我們并不會全部用到,但是我們必須知道他的運行傳遞原理,這樣遇到特殊的業務需求時,才不會出現卡殼,實際開發中我們多只要重寫onTouchEvent事件就已經能夠滿足需要,但是如果要重寫其他事件,我們就要考慮更周到些,牽扯的會比較多。

demo點這里

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐清市| 娱乐| 道真| 岗巴县| 乐安县| 会泽县| 广河县| 兴安县| 清镇市| 丰城市| 车险| 吉水县| 平舆县| 沽源县| 邹城市| 祁连县| 台北县| 微博| 定西市| 莎车县| 霍城县| 台北市| 仁寿县| 娄底市| 梨树县| 平泉县| 从化市| 高要市| 绥德县| 德兴市| 莫力| 海盐县| 东方市| 尚志市| 贵溪市| 宁晋县| 唐山市| 南郑县| 黔西| 体育| 自贡市|