码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-04-23 13:15:41      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

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   }  

 



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方法被调用,并返回true则这个手势事件就结束了,并不会向下传递到子控件。Q2:onTouchEvent什么时候被调用呢? 


3.onInterceptTouchEvent 

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

 
4.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方法就会一遍一遍地被调用)

 


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

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


onTouchEvent() 用于处理事件:返回值决定当前控件是否消费(consume)了这个事件

可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!

比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。 



 

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

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/5424359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!