android onInterceptTouchEvent()和onTouchEvent()的总结

来源:互联网 发布:大班pg菲尼克斯淘宝 编辑:程序博客网 时间:2024/05/12 23:03

onInterceptTouchEvent:

故名思议:拦截触摸事件 intercept 拦截,截断 TouchEvent 触摸事件
onInterceptTouchEvent是ViewGroup里定义的,View里面没有。
onInterceptTouchEvent是否拦截主要看返回值,返回true拦截,返回false(super.onInterceptTouchEvent(ev))不拦截,
系统默认返回false,这样touch事件会传递到View中。

onTouchEvent:
onTouchEvent在ViewGroup和View中都有定义。用于处理手势事件。

手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。


运行效果图

上图先理解一下,如果点击蓝色Button,首先调用ViewGroup里的onInterceptTouchEvent判断是否拦截,
拦截的话,调用ViewGroup自己的onTouchEvent方法
不拦截,事件传递给子控件button,调用Button中的onTouchEvent方法

二、上代码

1、新建一个ViewGroup代码如下:

package com.datong.mytouchdemo;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.FrameLayout;/** * Created by liyongjian on 2016/4/6. */public class ViewGroup1Activity extends FrameLayout{    public ViewGroup1Activity(Context context) {        super(context);    }    public ViewGroup1Activity(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent");        Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent default :" + super.onInterceptTouchEvent(ev));        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        Log.e(MainActivity.TAG,"ViewGroup1Activity onTouchEvent");        Log.e(MainActivity.TAG,"ViewGroup1Activity onTouchEvent default :" + super.onTouchEvent(event));        return super.onTouchEvent(event);    }}

2、新建一个view Button代码如下:

package com.datong.mytouchdemo;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.Button;/** * Created by liyongjian on 2016/4/6. */public class MyButtonActivity extends Button{    public MyButtonActivity(Context context) {        super(context);    }    public MyButtonActivity(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        Log.e(MainActivity.TAG, "MyButtonActivity onTouchEvent");        Log.e(MainActivity.TAG,"MyButtonActivity onTouchEvent default :" + super.onTouchEvent(event));        return super.onTouchEvent(event);    }}

3、新建布局activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><com.datong.mytouchdemo.ViewGroup1Activity    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="350dp"    android:background="#ff0000"    >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="ViewGroup1"        android:textSize="30sp"        android:textColor="#ffffff"        />        <com.datong.mytouchdemo.MyButtonActivity            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_margin="60dp"            android:background="#0000ff"            android:text="Button"            android:textSize="20sp"            android:textColor="#ffffff"            /></com.datong.mytouchdemo.ViewGroup1Activity>

4、主activity代码如下:

package com.datong.mytouchdemo;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {    public static final String TAG = "TAG";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

三、运行程序,效果图在上边

(1)、不设置拦截

1、点击蓝色Button,Log如下图:


可见点击button先调用ViewGroup的onInterceptTouchEvent方法,并且默认返回false不拦截,

然后再调用Button的onTouchEvent方法,并且View的onTouchEvent默认返回true。

2、点击红色ViewGroup,Log如下图:


可见点击ViewGroup先调用ViewGroup的onInterceptTouchEvent方法,

然后再调用ViewGroup自己的onTouchEvent方法,并且onTouchEvent默认返回false。

(2)ViewGroup拦截,修改ViewGroup中onInterceptTouchEvent返回值为true,修改代码如下:

    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent");        Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent default :" + super.onInterceptTouchEvent(ev));        return true;    }
1、点击蓝色Button,Log如下图:

可见点击button先调用ViewGroup的onInterceptTouchEvent方法,由于修改返回值为true,设置为拦截,

由于设置为拦截,还是调用ViewGroup的onTouchEvent方法。

2、点击红色ViewGroup,Log如下图:


不需要解释了吧。。。。。

最后总结:

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

ViewGroup里的onTouchEvent默认值是false。

View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件。




1 0
原创粉丝点击