• Android在onInterceptTouchEvent与onTouchEvent


    onInterceptTouchEvent:

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

    onTouchEvent:

    onTouchEvent相同也是在view中定义的一个方法。处理传递到view 的手势事件。手势事件类型包含ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。

    当中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onTouch默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时候,onTouch回继续调用ACTION_UP事件,假设onTouch里返回值是false,那么onTouch仅仅会调用ACTION_DOWN而不调用ACTION_UP.

    为了让当家更easy理解我写了一个简单的Demo.自己定义了Layout与View,Androidproject文件夹例如以下:

    新建一个MyLayout.java代码例如以下:


    [java] view plaincopy
    1. package com.tutor.touch;  
    2.   
    3. import android.content.Context;  
    4. import android.util.AttributeSet;  
    5. import android.util.Log;  
    6. import android.view.MotionEvent;  
    7. import android.widget.FrameLayout;  
    8.   
    9. public class MyLayout extends FrameLayout {  
    10.   
    11.       
    12.     public MyLayout(Context context){  
    13.         super(context);  
    14.     }  
    15.       
    16.     public MyLayout(Context context, AttributeSet attrs) {  
    17.         super(context, attrs);  
    18.         // TODO Auto-generated constructor stub  
    19.     }  
    20.   
    21.     @Override  
    22.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
    23.         Log.e(TouchDemoActivity.TAG, "MyLayout onInterceptTouchEvent.");  
    24.         Log.e(TouchDemoActivity.TAG,"MyLayout onInterceptTouchEvent default return "   
    25.         + super.onInterceptTouchEvent(ev));  
    26.         return super.onInterceptTouchEvent(ev);  
    27.     }  
    28.       
    29.       
    30.       
    31.     @Override  
    32.     public boolean onTouchEvent(MotionEvent event) {  
    33.         Log.e(TouchDemoActivity.TAG, "MyLayout onTouchEvent.");  
    34.         Log.e(TouchDemoActivity.TAG,"MyLayout onTouchEvent default return "   
    35.         + super.onTouchEvent(event));  
    36.         return super.onTouchEvent(event);  
    37.     }  
    38. }  

    然后新建一个MyView.java代码例如以下:

    [java] view plaincopy
    1. package com.tutor.touch;  
    2.   
    3. import android.content.Context;  
    4. import android.util.AttributeSet;  
    5. import android.util.Log;  
    6. import android.view.MotionEvent;  
    7. import android.widget.Button;  
    8.   
    9. public class MyView extends Button {  
    10.   
    11.     public MyView(Context context){  
    12.         super(context);  
    13.     }  
    14.       
    15.     public MyView(Context context, AttributeSet attrs) {  
    16.         super(context, attrs);  
    17.     }  
    18.       
    19.     @Override  
    20.     public boolean onTouchEvent(MotionEvent event) {  
    21.         Log.e(TouchDemoActivity.TAG, "MyView onTouchEvent.");  
    22.         Log.e(TouchDemoActivity.TAG,"MyView onTouchEvent default return "   
    23.         + super.onTouchEvent(event));  
    24.         return super.onTouchEvent(event);  
    25.     }  
    26.   
    27. }  

    当中TouchDemoActivity代码例如以下:

    [java] view plaincopy
    1. package com.tutor.touch;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5.   
    6. public class TouchDemoActivity extends Activity {  
    7.     public static final String TAG = "TouchDemoActivity";  
    8.     @Override  
    9.     public void onCreate(Bundle savedInstanceState) {  
    10.         super.onCreate(savedInstanceState);  
    11.         setContentView(R.layout.main);  
    12.     }  
    13. }  

    上面全部的布局文件main.xml代码例如以下:

    [java] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?

      >  

    2. <com.tutor.touch.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.      >  
    6.   
    7.     <com.tutor.touch.MyView  
    8.         android:layout_width="fill_parent"  
    9.         android:layout_height="wrap_content"  
    10.         android:text="@string/hello" />  
    11.   
    12. </com.tutor.touch.MyLayout>  

    执行上述Androidproject效果例如以下:

    点击红色区域。触发了MyView里的onTouch事件查看logcat,例如以下图:

    点击绿色区域,则触发了MyLayout里的onTouch事件,查看logcat,例如以下图:

    上面俩个截图都是用系统默认值,能够得出结论:onInterceptTouchEvent默认返回值是false,MyLayout里onTouchEvent默认返回值是false。所以仅仅消费了ACTION_DOWN事件,MyView里onTouch默认返回值是true,调用了俩次:ACTION_DOW,ACTION_UP。

    以下我们把MyLayout.java里的onInterceptTouchEvent的return值改动为true。代码例如以下:

    [java] view plaincopy
    1. @Override  
    2.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
    3.         Log.e(TouchDemoActivity.TAG, "MyLayout onInterceptTouchEvent.");  
    4.         Log.e(TouchDemoActivity.TAG,"MyLayout onInterceptTouchEvent default return "   
    5.         + super.onInterceptTouchEvent(ev));  
    6.         return true;  
    7.     }  

    执行project。继续点击红色区域,查看logcat。发现MyView的onTouch事件没有被调用,也就是被拦截了例如以下图所看到的:

    让我们继续实验,让onInterceptTouchEvent的返回值继续为false,将MyView里的onTouchEvent的返回值改动为false,即MyView里的onTouchEvent改动例如以下:

    [java] view plaincopy
    1. @Override  
    2. public boolean onTouchEvent(MotionEvent event) {  
    3.     Log.e(TouchDemoActivity.TAG, "MyView onTouchEvent.");  
    4.     Log.e(TouchDemoActivity.TAG,"MyView onTouchEvent default return "   
    5.     + super.onTouchEvent(event));  
    6.     return false;  
    7. }  

    执行project,继续点击红色区域。查看logcat,例如以下图:

    依据上图,我们能够看出MyView里的OnTouchEvent仅仅消费了一次点击事件也就是ACTION_DOWN,还没有运行ACTION_UP,然后跑到MyLayout里又去运行了OnTouchEvent事件。

    所以依据上面的内容总结例如以下:

    ViewGroup里的onInterceptTouchEvent默认值是false这样才干把事件传给View里的onTouchEvent.

    ViewGroup里的onTouchEvent默认值是false。

    View内onTouchEvent返回默认值它是true.这种多次运行能力touch事件。

  • 相关阅读:
    PDF文件中的Form保存问题
    Understanding IP Fragmentation
    tcp ip guide IPsec IKE
    Windows安全事件日志中的事件编号与描述
    Cisco PIX fix up and Juniper firewall FTP ALG
    很好的IPSec介绍,详细解释了IKE协商的2个阶段的作用
    virtualbox 下运行Ubuntu 8.10的分辨率和guest additions的问题。
    Fixing the ‘Do you want to display nonsecure items’ message
    windows xp 开始菜单里面所有项目右键不起作用。
    HP backup and recovery manager
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5043319.html
Copyright © 2020-2023  润新知