android onTouchEvent和setOnTouchListener中onTouch的区别

android中onTouchEvent和setOnTouchListener中onTouch的区别可以有些人并不了解,其实要说明白这个问题先要说下android的事件传递机制。首先看下以下的代码1,这段代码反应了View处理事件的过程:

代码1:

public boolean dispatchTouchEvent(MotionEvent event) {
        if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
            return true;
        }
        return onTouchEvent(event);
    }

在代码1中有一点首先需要明确

1、如果dispatchTouchEvent返回值为true则本次事件被系统消耗掉(就是被控件处理了), 然后一个新的事件会被传入(如down事件返回true,则后续的move、up等事件也将被系统传入进行处理,否则move、up等事件不会响应);

2、如果dispatchTouchEvent返回值为false,则不会有新的事件被传入。

 

好,明白了这一点再看那个代码1中if语句后面的条件mOnTouchListener != null && mOnTouchListener.onTouch(this, event),mOnTouchListener 对象其实不就是你写的监听器对象吗?

比如下面代码2的这个匿名对象。

代码2:

xxxView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });

好,我们再看下代码2中onTouch事件中的返回值:

1、如果代码2 return true则代表代码1中将不会执行 return onTouchEvent(event);语句,这也就是说这次系统事件会被消耗掉,将会再次执行dispatchTouchEvent这个方法。

2、如果代码2 return false则代表代码1会执行onTouchEvent(event);这个方法,本次事件是否会被消耗掉将取决于onTouchEvent的返回值。

 

总结:

1、如果setOnTouchListener中的onTouch方法返回值是true则onTouchEvent方法将不会被执行;

2、只有当setOnTouchListener中的onTouch方法返回值是false时onTouchEvent方法才被执行。

3、以上说的情况适用于View对象而不是ViewGroup对象,ViewGroup对象下次再分析。

 

1.onTouch方法:
onTouch方法是View的 OnTouchListener借口中定义的方法。
当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。
(当把手放到View上后,onTouch方法被一遍一遍地被调用)

2.onTouchEvent方法:
onTouchEvent方法是override 的Activity的方法。
重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
(当把手放到Activity上时,onTouchEvent方法就会一遍一遍地被调用)

3.touch事件的传递:
在一个Activity里面放一个TextView的实例tv,并且这个tv的属性设定为 fill_parent
在这种情况下,当手放到屏幕上的时候,首先会是tv响应touch事件,执行onTouch方法。

如果onTouch返回值为true,
表示这个touch事件被onTouch方法处理完毕,不会把touch事件再传递给Activity,
也就是说onTouchEvent方法不会被调用。
(当把手放到屏幕上后,onTouch方法被一遍一遍地被调用)

如果onTouch的返回值是false,
表示这个touch事件没有被tv完全处理,onTouch返回以后,touch事件被传递给Activity,
onTouchEvent方法被调用。
(当把手放到屏幕上后,onTouch方法调用一次后,onTouchEvent方法就会一遍一遍地被调用)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 实现 swipe 手势功能,你可以使用 GestureDetector 类。该类提供了一些方法,可用于检测 swipe 手势,并根据手势方向执行相应的操作。下面是一个简单的示例: ``` public class MyActivity extends Activity implements GestureDetector.OnGestureListener { private GestureDetector gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gestureDetector = new GestureDetector(this, this); } @Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // Swipe left if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // Perform action for left swipe return true; } // Swipe right if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // Perform action for right swipe return true; } return false; } } ``` 这个示例代码使用了 `GestureDetector` 类来检测 swipe 手势。在 `onTouchEvent` 方法,我们将触摸事件传递给 `gestureDetector` 对象。在 `onFling` 方法,我们检测手势方向和速度,并根据手势方向执行相应的操作。 要实现页面拖动动画,你可以使用 `ValueAnimator` 类。该类提供了一些方法,可用于创建动画效果,并根据动画时间和属性值执行相应的操作。下面是一个简单的示例: ``` public class MyActivity extends Activity implements View.OnTouchListener { private float lastX; private float lastY; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = findViewById(R.id.my_view); view.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = event.getX(); lastY = event.getY(); break; case MotionEvent.ACTION_MOVE: float deltaX = event.getX() - lastX; float deltaY = event.getY() - lastY; View view = findViewById(R.id.my_view); view.setTranslationX(view.getTranslationX() + deltaX); view.setTranslationY(view.getTranslationY() + deltaY); lastX = event.getX(); lastY = event.getY(); break; } return true; } } ``` 这个示例代码使用了 `ValueAnimator` 类来创建动画效果。在 `onTouch` 方法,我们检测触摸事件,并根据事件的移动距离更新视图的位置。通过使用 `setTranslationX` 和 `setTranslationY` 方法,我们可以将视图沿水平和垂直方向移动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值