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

如有错误欢迎指正和交流.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值