Android触摸事件传递图解

 更新时间:2017年01月02日 14:40:41   作者:豌豆琪琪  
这篇文章主要一图文结合的方式为大家详细介绍了Android触摸事件传递,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本博文讲解流程

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点这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • RxJava之网络请求最常见的三种场景

    RxJava之网络请求最常见的三种场景

    本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。这篇文章主要介绍了RxJava之网络请求最常见的三种场景,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • android组件SwipeRefreshLayout下拉小球式刷新效果

    android组件SwipeRefreshLayout下拉小球式刷新效果

    这篇文章主要为大家详细介绍了android组件SwipeRefreshLayout下拉小球式刷新效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android实现滑块拼图验证码功能

    Android实现滑块拼图验证码功能

    这篇文章主要介绍了Android实现滑块拼图验证码功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Android 虚拟按键适配动态调整布局的方法

    Android 虚拟按键适配动态调整布局的方法

    今天小编就为大家分享一篇Android 虚拟按键适配动态调整布局的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android Java调用自己C++类库的实例讲解

    Android Java调用自己C++类库的实例讲解

    今天小编就为大家分享一篇关于Android Java调用自己C++类库的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android开发手机无线调试的方法

    Android开发手机无线调试的方法

    今天小编就为大家分享一篇关于Android开发手机无线调试的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Android实现自动文本框提示功能

    Android实现自动文本框提示功能

    这篇文章主要为大家详细介绍了Android实现自动文本框提示功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android从相册选择图片剪切和上传

    Android从相册选择图片剪切和上传

    这篇文章主要为大家详细介绍了Android从相册选择一个图片剪切、上传的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android用注解与反射实现Butterknife功能

    Android用注解与反射实现Butterknife功能

    Butterknife是一个在android上实现ioc(控制反转)的一个库。ioc的核心是解耦。解耦的目的是修改耦合对象时不影响另外一个对象,降低模块之间的关联。在Spring中ioc更多的是依靠xml的配置。而android上的IOC框架可以不使用xml配置
    2022-11-11
  • Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)

    Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)

    下面小编就为大家带来一篇Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论