Android中View的onTouchEvent和OnTouch区别

以自定义的TestButton为例。

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

[java] view plain copy

print?

  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 copy

print?

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

[java] view plain copy

print?

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

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

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

[java] view plain copy

print?

  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,这些事件将不会被触发。

时间: 2025-01-02 17:36:03

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

Android View的onTouchEvent和OnTouch区别

我们可以通过重写onTouchEvent方法来处理诸如down move up的消息: [java] view plaincopyprint? public class TestButton extends Button { public TestButton(Context context) { super(context); // TODO Auto-generated constructor stub } public TestButton(Context context, Attribu

Android中onInterceptTouchEvent与onTouchEvent

onInterceptTouchEvent: onInterceptTouchEvent是在ViewGroup里面定义的.Android中的layout布局类一般都是继承此类的.onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent. onTouchEvent: onTouchEvent同样也是在view中定义的一个方法.处理传递到view 的手势事件.手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACT

源码解析Android中View的measure量算过程

Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View的布局及绘图机制>.量算是布局和绘图的基础,所以量算是很重要的一个环节.本文将从源码角度解析View的量算过程,这其中会涉及某些关键类以及关键方法. 对View进行量算的目的是让View的父控件知道View想要多大的尺寸. 量算过程概述 如果要进行量算的View是ViewGroup类型,那么ViewGr

android中activity.this跟getApplicationContext的区别

转载: http://www.myexception.cn/android/1968332.html android中activity.this和getApplicationContext的区别 在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求传递的 参数就是一个context,在这里我们传入的是this,那么这个this究

Android中View和ViewGroup介绍

1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGroup是View的子类,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型. ViewGroup(树根)和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接

android中View点击和触摸事件的处理

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底 是View

深入理解Android中View

文章目录 [隐藏] 一.View是什么? 二.View创建的一个概述: 三.View的标志(Flag)系统 四.MeasureSpec 五.几个重要方法简介 5.1 onFinishInflate() 5.2 onMeasure(int, int) 5.3 onLayout(boolean, int, int,int, int) 5.4 onSizeChanged(int, int, int,int) 5.5 onDraw(android.graphics.Canvas) 这回我们是深入到Vie

Android中View绘制流程以及invalidate()等相关方法分析

前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解 Android 框架层的网友,推荐这本书,希望你们能够在Android开发里学到更多的知识 . 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure).是否重新需要安置视图的位置(layout).以及是否需要重绘 (d

Android中View的绘制过程 onMeasure方法简述

Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制. 绘制是一个两遍(two pass)的过程:一个mea