Touch事件传递流程、事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?

Touch事件传递流程
1.Touch事件类型
 Touch事件被封装成MotionEvent,用户当前的touch事件主要类型有:
       ACTION_DOWN: 表示用户开始触摸
     ACTION_MOVE: 表示用户在移动(手指或者其他)
     ACTION_UP:表示用户抬起了手指
     ACTION_CANCEL:表示手势被取消了
     ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.
     ACTION_POINTER_DOWN:有一个非主要的手指按下了.
     ACTION_POINTER_UP:一个非主要的手指抬起来了

2.Touch事件元数据
     touch事件的元数据主要包括:touch的位置、手指的个数、touch事件的时间。一个touch手势被定义为以ACTION_DOWN开始和以 ACTION_UP结束。
3.事件传递流程:
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);

能够响应这些方法的控件包括:ViewGroup、View、Activity。

方法与控件的对应关系如下:

  Touch 事件相关方法 方法功能 ViewGroup View Activity
  public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes Yes
  public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 Yes No No
  public boolean onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes


区别:

        onTouch方法优先级比onTouchEvent高,会先触发。假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。

使用:

1、onTouch()方法:

  onTouch方式是View的OnTouchListener接口中定义的方法。当一个View绑定了OnTouchListener后,当有Touch事件触发时,就会调用onTouch方法。

testBt.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN://0
                Log.e("TAG", " onTouch按住");
                break;
            case MotionEvent.ACTION_UP://1
                Log.e("TAG", " onTouch抬起");
                break;
            case MotionEvent.ACTION_MOVE://2
                Log.e("TAG", " onTouch移动");
                break;
        }
        //事件分发
        //1setOnTouchListener单独使用的时候返回值需要true,这样才能保证移动的时候获取相应的监听,而非一次监听(即只有按下事件)
        //返回false,表示没有被处理,将向父View传递。只能监听到view"按下"事件,"移动""抬起"都不能监听到。因为down事件未结束
        //返回true,消耗此事件,表示正确接收并处理,不在分发。"按下""抬起""移动"都能监听到了

        //2setOnTouchListenersetOnClickListener同时使用时,
        //返回true,事件被onTouch消耗掉了,因而不会在继续向下传递。只能监听"按下""抬起""移动",不能监听到"点击"        //返回false,"按下""抬起""移动""点击"都能监听

       //onTouch是优先于onClick的,并且执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(可能还会有多次ACTION_MOVE)因此事件传递的顺序是先经过OnTouch,再传递给onClick
        return false;
        
    }
});

2、onTouchEvent()方法:

  onTouchEvent方法时重载的Activity的方法 重写了Acitivity的onTouchEvent方法后,当屏幕有Touch事件时,此方法就会被调用。

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN://0
            Log.e("TAG", " onTouchEvent 按住");
            break;
        case MotionEvent.ACTION_UP://1
            Log.e("TAG", " onTouchEvent 抬起");
            break;
        case MotionEvent.ACTION_MOVE://2
            Log.e("TAG", " onTouchEvent 移动");
            break;
    }
    return super.onTouchEvent(event);
}




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值