• Android进阶笔记16: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 be invoked when a touch event is 
     3   * dispatched to this view. The callback will be invoked before the touch 
     4   * event is given to the view. 
     5   */  
     6   public interface OnTouchListener {  
     7       /** 
     8         * Called when a touch event is dispatched to a view. This allows listeners to 
     9         * get a chance to respond before the target view. 
    10         * 
    11         * @param v The view the touch event has been dispatched to. 
    12         * @param event The MotionEvent object containing full information about 
    13         *        the event. 
    14         * @return True if the listener has consumed the event, false otherwise. 
    15         */  
    16        boolean onTouch(View v, MotionEvent event);  
    17   }  

      例如想捕获Gallery的Touch事件做自己想要的处理,但你添加完setOnTouchListener监听完之后eclipse自动会生成一个onTouch方法,就可以在这里面做你想要做的处理了,若你小心地看它会增加return false这行。我在处理完Event.ACTION_MOVE时将其改为return true。当我运行我的程序的时候发现Gallery不能左右滚动了。我就觉得很纳闷了,怎么不能滚动了呢?然后一个朋友提示我应该return false.我改完运行后,果真可以滚动了,并且我在move的时候也实现了我的处理。当时我就在想:return falsereturn true有何区别呢? 

    返回false说明你还没消费onTouch事件,在执行完你onTouch里面的代码之后onTouch事件并没有结束。就是会自动地执行Gallery这个view里onTouch代码(这个为默认). 所以这就是为什么没增加你的处理的时候就只自动地调用Gallery的onTouch,若你在onTouch里面增加你的代码并且return false就会执行你的处理和默认的处理。 

    返回true:说明你已经消费完了onTouch事件,在执行完你的onTouch里面的代码之后,这个onTouch事件就结束了。也就是说不会再调用默认的onTouch事件了。在onTouch里面有很多种的处理比如move,down,up....,若你在move里面return false,那么接着的fling,up等后面的事件也不会处理的。


    2. onTouchEvent方法
    onTouchEvent方法是View自定义方法,Activity继承自View,自然Activity也是有的

    onTouchEvent是处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四种事件。

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

     1 /** 
     2     * Implement this method to handle touch screen motion events. 
     3     * 
     4     * @param event The motion event. 
     5     * @return True if the event was handled, false otherwise. 
     6     */  
     7    public boolean onTouchEvent(MotionEvent event) {  
     8     ……  
     9     ……  
    10   }  

      onTouchEvent()用于处理事件(重点onTouch这个事件是从子控件回传到父控件的一层层向下传),返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后是否还允许Touch事件继续向上(父控件)传递

    返回false:则向上传递给父控件,详细一点就是这个touch事件就给了父控件,那么后面的up事件就是到这里touch触发,不会在传给它的子控件。如果父控件依然是false,那touch的处理就给到父控件的父控件,那么up的事件处理都在父控件的父控件,不会触发下面的。

    返回true:如果是子控件返回true,那么它的touch事件都在这里处理,父控件是处理不了,因为它收不到子控件传给他的touch,被子控件给拦截了。

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

    public boolean onInterceptTouchEvent(MotionEvent ev) {  
              return false;  
      }  

    此方法返回false,则手势事件会向子控件传递返回true则调用onTouchEvent方法。 

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


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

     

    4. onInterceptTouchEvent 

    onInterceptTouchEvent是在ViewGroup里面定义的。Android中的layout布局类一般都是继承此类的。onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。


    onInterceptTouchEvent()用于处理事件并改变事件的传递方向:

    返回值为false时:事件会传递给子控件的onInterceptTouchEvent(); 
    返回值为true时:事件会传递给当前控件的onTouchEvent(),而不再传递给子控件,这就是所谓的Intercept(截断)





     

  • 相关阅读:
    Python之面向对象新式类和经典类
    Python之面向对象继承和派生
    Python之面向对象类和对象
    Python之面向对象的程序设计
    Python之面向对象函数式编程
    Python之内置函数
    列表解析与生成器表达式
    03: 交换机基本原理与配置
    02: 网络布线与数制转换
    01:数据封装解封的过程
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5424359.html
Copyright © 2020-2023  润新知