Android View的onTouchEvent和OnTouch区别

我们可以通过重写onTouchEvent方法来处理诸如down move up的消息:

[java] view
plain
copyprint?

  1. public class TestButton extends Button {
  2. public TestButton(Context context) {
  3. super(context);
  4. // TODO Auto-generated constructor stub
  5. }
  6. public TestButton(Context context, AttributeSet attributeSet) {
  7. super(context, attributeSet);
  8. // TODO Auto-generated constructor stub
  9. }
  10. @Override
  11. public boolean onTouchEvent(MotionEvent event) {
  12. boolean value = super.onTouchEvent(event);
  13. System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
  14. return value;
  15. }

也可以通过实现OnTouchListener的接口,然后设置TestButton的onTouchListener可以达到同样的目的

[java] view
plain
copyprint?

  1. class OnTouchListenerTest implements View.OnTouchListener{
  2. @Override
  3. public boolean onTouch(View v, MotionEvent event) {
  4. return false;
  5. }
  6. }

[java] view
plain
copyprint?

  1. TestButton b = (TestButton)findViewById(R.id.button);
  2. OnTouchListenerTest listener = new OnTouchListenerTest();
  3. b.setOnTouchListener(listener);

但上述两种监听有什么区别呢?

先看一下Android源码中对于View中dispatchTouchEvent的实现:

[java] view
plain
copyprint?

  1. public boolean dispatchTouchEvent(MotionEvent event){
  2. ... ...
  3. if(onFilterTouchEventForSecurity(event)){
  4. ListenerInfo li = mListenerInfo;
  5. if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
  6. && li.mOnTouchListener.onTouch(this, event)) {
  7. return true;
  8. }
  9. if(onTouchEvent(event)){
  10. return true;
  11. }
  12. }
  13. ... ...
  14. return false;
  15. }

可以看到onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch方法返回true,

表示此次事件已经被消费了,那onTouchEvent是接收不到消息的。

因为Button的performClick是利用onTouchEvent实现,假若onTouchEvent没有被调用到,那么Button的Click事件也无法响应。

综合来讲:

onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。

假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。

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

时间: 2024-10-09 04:26:08

Android View的onTouchEvent和OnTouch区别的相关文章

Android中View的onTouchEvent和OnTouch区别

以自定义的TestButton为例. 我们可以通过重写onTouchEvent方法来处理诸如down move up的消息: [java] view plain copy print? public class TestButton extends Button { public TestButton(Context context) { super(context); // TODO Auto-generated constructor stub } public TestButton(Con

从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程(一)

关于Android View 事件分发过程的文章网络上可以搜到一把大,这里贴一篇代码性的文章,作者也是个牛人:Android事件分发机制完全解析,带你从源码的角度彻底理解(上). 虽然讲的很好,但是看完之后还是感觉有那么点一知半解,于是自己花了点时间从源码研究android 触摸事件分发流程,以下内容仅仅个人理解,如有差错希望指出. 我们先从一个例子看起,先重写一个MyButton 继承Button,代码如下: public class MyButton extends Button { pub

Android进阶笔记20:onInterceptTouchEvent、onTouchEvent与onTouch

1.onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法,处理View及其子类被touch是的事件处理.当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法. 当然,前提是touch时间能够传递到指定的view.Q1:为什么会传递不到呢? (当把手放到View上后,onTouch方法被一遍一遍地被调用) 1 /** 2 * Interface definition for a callback to

android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系

区别与联系 View: 显示视图,内置画布,提供了图形绘制函数.触屏事件.按键事件函数等,必须在UI主线程内更新画面,速度较慢: SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,使用了双缓冲机制,即:允许在子线程中更新画面,所以刷新界面速度比view快. GLSurfaceView: 基于SurfaceView视图再次进行拓展的视图类,在SurfaceView基础上封装了EGL环境管理以及render线程,专用于3D游戏开发的视图.是Surfa

Android View 触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉.所以每时每刻都去学习,去发现和理解新的东西. 引言 由于之前写的一篇关于Android事件传递顺序的博客质量太差,可能是理解不到位的原因,故最近又花了许多时间再次去看Android源码,看完之后有了新的理解,所以打算重新整理这篇博客.理解Android触摸事件传递机制有助于日后的开发以及自定义一些手势效果等.注意:这篇博客是基于Android2.0源码来分析的,不管老版本还是新版本的Android,其内部触

Android View触摸屏事件派发机制详解与源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 1.背景 最近在简书和微博还有Q群看见很多人说Android自定义控件(View/ViewGroup)如何学习?为啥那么难?其实答案很简单:"基础不牢,地动山摇." 不扯蛋了,进入正题.就算你不自定义控件,你也必须要了解Android控件的触摸屏事件传递机制(之所以说触摸屏是因为该

Android View事件机制 21问21答

1.View的坐标参数 主要有哪些?分别有什么注意的要点? 答:Left,Right,top,Bottom 注意这4个值其实就是 view 和 他的父控件的 相对坐标值. 并非是距离屏幕左上角的绝对值,这点要注意. 此外,X和Y 其实也是相对于父控件的坐标值. TranslationX,TranslationY 这2个值 默认都为0,是相对于父控件的左上角的偏移量. 换算关系: x=left+tranX,y=top+tranY. 很多人不理解,为什么事这样,其实就是View 如果有移动的话,比如

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr

Android View框架总结(八)ViewGroup事件分发机制

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52298780 上篇分析了View的事件分发流程,留了一个问题:如果上面的EventButton继承TextView的话,按下抬起,会有一个现象,我可以告诉大家现象:就是只有dispatchTouchEvent ACTION_DOWN,onTouch ACTION_DOWN,onTouchEvent ACTION_DOWN这三个,你移动,或者抬起,是没有MOVE,或者