源码分析onTouch和onTouchEvent以及onClick的执行顺序,有什么区别

本文详细解析了onTouchListener的onTouch方法与onTouchEvent的优先级关系,阐述了当onTouch方法返回true时,onTouchEvent将不会被调用,从而影响view内置事件如click的触发。
  1. onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。

  2. 如果onTouch方法返回false会接着触发onTouchEvent,如果返回true则onTouchEvent方法不会被调用。

  3. view内置诸如click事件的实现等等都基于onTouchEvent的performClick方法,假如onTouch返回true,这些事件将不会被触发。

 

onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch方法返回true, 
表示此次事件已经被消费了,那onTouchEvent是接收不到消息的。 

 

 

如果给一个view设置一个onTouchListener并且重写onTouch方法,返回值为true,那么onTouchEvent方法则不被调用, 由于view的performClick是利用onTouchEvent实现,假若onTouchEvent没有被调用到,那么Button的Click事件也无法响应。

### Android 中 `onTouch` `onTouchEvent` 的区别与用法 在 Android 开发中,`onTouch` `onTouchEvent` 是处理触摸事件的两种不同机制。以下是它们的区别用法: #### 1. **`onTouch` 方法** - `onTouch` 是一个回调方法,通常通过实现 `View.OnTouchListener` 接口来使用。 - 它由用户直接绑定到某个 `View` 上,用于捕获该视图上的触摸事件。 - 当绑定到某个视图时,`onTouch` 方法会优先于 `onTouchEvent` 被调用[^1]。 - 返回值为布尔类型: - 如果返回 `true`,表示事件已经被处理,后续的触摸事件(如 `ACTION_MOVE`、`ACTION_UP`)将继续传递给当前 `onTouch` 方法。 - 如果返回 `false`,表示事件未被处理,系统会继续将事件传递给视图的 `onTouchEvent` 方法。 **示例代码:** ```java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // 处理按下事件 return true; // 表示事件已处理 } return false; // 表示事件未处理 } }); ``` #### 2. **`onTouchEvent` 方法** - `onTouchEvent` 是 `View` 类中的一个方法,由视图的派生类重写以处理触摸事件。 - 它仅在 `onTouch` 方法返回 `false` 或未绑定 `OnTouchListener` 时被调用。 - 返回值为布尔类型: - 如果返回 `true`,表示事件已被消耗,不再传递给父视图。 - 如果返回 `false`,表示事件未被消耗,会传递给父视图的 `onTouchEvent` 方法[^3]。 **示例代码:** ```java @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // 处理按下事件 return true; // 表示事件已处理 } return super.onTouchEvent(event); // 将事件传递给父类 } ``` #### 3. **事件分发机制** - 在 Android 中,触摸事件的分发遵循以下顺序: - `dispatchTouchEvent` → `onInterceptTouchEvent`(仅限 `ViewGroup`)→ `onTouch`(如果绑定了 `OnTouchListener`)→ `onTouchEvent`。 - 如果 `onTouch` 方法返回 `true`,则事件停止向下传递,`onTouchEvent` 不会被调用。 - 如果 `onTouch` 方法返回 `false`,则事件会继续传递到 `onTouchEvent` 方法[^2]。 #### 4. **总结** - `onTouch` 是一种外部机制,通过 `OnTouchListener` 接口绑定到视图上,适用于需要拦截或自定义事件处理逻辑的场景。 - `onTouchEvent` 是一种内部机制,由视图的派生类重写,适用于需要在视图内部处理事件的场景。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值