zoukankan      html  css  js  c++  java
  • Android View的onTouchEvent和OnTouch区别

    http://blog.csdn.net/huiguixian/article/details/22193977

    还是以自定义的TestButton为例。

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

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

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

    1.   class OnTouchListenerTest implements View.OnTouchListener{  
    2. @Override  
    3. public boolean onTouch(View v, MotionEvent event) {  
    4.     return false;  
    5. }  
    6.       
    7.   }  
    1. TestButton b = (TestButton)findViewById(R.id.button);  
    2. OnTouchListenerTest listener = new OnTouchListenerTest();  
    3. b.setOnTouchListener(listener);  

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

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

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

  • 相关阅读:
    changing a pointer rather than erasing memory cells
    验证码识别 edge enhancement 轮廓增强 region finding 区域查找
    Manipulating Data Structures
    passing parameters by value is inefficient when the parameters represent large blocks of data
    Aliasing 走样
    Artificial Intelligence Research Methodologies 人工智能研究方法
    Thread safety
    include pointers as a primitive data type
    flat file
    functional cohesion
  • 原文地址:https://www.cnblogs.com/carl2380/p/4193902.html
Copyright © 2011-2022 走看看