Android 中 OnTouch事件的研究
2011-05-25 21:27
330 查看
在Android中当一个ViewGroup 中包含一个组件,当点击这个组件同时监听其onTouch事件,那么到底是父组件响应还是子组件响应呢?傻蛋在网上找到了一篇相关的帖子,照着例子测试了一番,发现网上的那篇有点问题,先把测试结果总结如下.
在触发OnTouch事件的时候Android的GroupView会调用如下三个函数:
public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分发
public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的拦截
public boolean onTouchEvent(MotionEvent ev) 处理事件
当然我们可以在容器类中如继承自LinearLayout的类中重写这三个方法。而继承View类的子类只能重写dispatch和onTouchEvent两个方法。当点击后这三个方法相继执行。
自己写了一个TextView子类MyTextView和LinearLayout子类MyLinearLayout,TextView包含在LinearLayout中。
当点击MyTextView时,程序会先进入到LinearLayout的dispatchTouchEvent中,这个类必须调用super.dispatchTouchEvent(ev); 否在后面的两个方法无法触发,所以傻蛋发现这个方法根本没有必要重写,因为框架是在super.dispatchTouchEvent(ev);中来调用onInterceptTouchEvent和onTouchEvent方法的,所以手动的设置dispatchTouchEvent的返回值是无效的,除非你不想让框架触发这两个方法。
当执行完dispathTouchEvent后会执行onInterception方法,如果返回为true,这表示MyLinearLayout把这个Touch事件拦截了,就会执行自己的Ontouch方法。如果为false则表示不拦截,此事件会分发到把事件传递给它的子控件MyTextView中。
当事件传递到MyTextView后,会执行dispatchTouchEvent,然后会执行onTouchEvent。挡在MyTextView中的onTouchEvent返回为false的话,当执行完onTouchEvent中的事件后,事件会再分发给MyLinearLaytout,执行LinearLayout的onTouchEvent。
主要代码如下
?[Copy to clipboard]Download zuiniuwang.java
?[Copy to clipboard]Download zuiniuwang.xml
在触发OnTouch事件的时候Android的GroupView会调用如下三个函数:
public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分发
public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的拦截
public boolean onTouchEvent(MotionEvent ev) 处理事件
当然我们可以在容器类中如继承自LinearLayout的类中重写这三个方法。而继承View类的子类只能重写dispatch和onTouchEvent两个方法。当点击后这三个方法相继执行。
自己写了一个TextView子类MyTextView和LinearLayout子类MyLinearLayout,TextView包含在LinearLayout中。
当点击MyTextView时,程序会先进入到LinearLayout的dispatchTouchEvent中,这个类必须调用super.dispatchTouchEvent(ev); 否在后面的两个方法无法触发,所以傻蛋发现这个方法根本没有必要重写,因为框架是在super.dispatchTouchEvent(ev);中来调用onInterceptTouchEvent和onTouchEvent方法的,所以手动的设置dispatchTouchEvent的返回值是无效的,除非你不想让框架触发这两个方法。
当执行完dispathTouchEvent后会执行onInterception方法,如果返回为true,这表示MyLinearLayout把这个Touch事件拦截了,就会执行自己的Ontouch方法。如果为false则表示不拦截,此事件会分发到把事件传递给它的子控件MyTextView中。
当事件传递到MyTextView后,会执行dispatchTouchEvent,然后会执行onTouchEvent。挡在MyTextView中的onTouchEvent返回为false的话,当执行完onTouchEvent中的事件后,事件会再分发给MyLinearLaytout,执行LinearLayout的onTouchEvent。
主要代码如下
?[Copy to clipboard]Download zuiniuwang.java
/** * MyLinearLayout.java * com.androidtest.touch.test * * Function: TODO * * ver date author * ────────────────────────────────── * 2011-5-24 Leon * * Copyright (c) 2011, TNT All Rights Reserved. */ package com.androidtest.touch.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * ClassName:MyLinearLayout Function: TODO ADD FUNCTION Reason: TODO ADD REASON * * @author Leon * @version * @since Ver 1.1 * @Date 2011-5-24 */ public class MyLinearLayout extends LinearLayout { private final static String TAG = MyLinearLayout.class.getSimpleName(); public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub Log.v(TAG , TAG); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "dispatchTouchEvent action:ACTION_CANCEL"); break; } // Log.v(TAG , "dispatchTouchEvent "+super.dispatchTouchEvent(ev)); super.dispatchTouchEvent(ev); Log.v(TAG , "dispatchTouchEvent "+ "test................."); return true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL"); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "---onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); break; } return true; } } /** * MyTestView.java * com.androidtest.touch.test * * Function: TODO * * ver date author * ────────────────────────────────── * 2011-5-24 Leon * * Copyright (c) 2011, TNT All Rights Reserved. */ package com.androidtest.touch.test; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.TextView; /** * ClassName:MyTestView Function: TODO ADD FUNCTION Reason: TODO ADD REASON * * @author Leon * @version * @since Ver 1.1 * @Date 2011-5-24 */ public class MyTestView extends TextView { public static final String TAG = MyTestView.class.getSimpleName(); public MyTestView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub Log.v(TAG, TAG); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "onTouchEvent action:ACTION_CANCEL"); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "---onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); break; } return false; } } /** * TestTouchEvent.java * com.androidtest.touch.test * * Function: TODO * * ver date author * ────────────────────────────────── * 2011-5-24 Leon * * Copyright (c) 2011, TNT All Rights Reserved. */ package com.androidtest.touch.test; import com.androidtest.R; import android.app.Activity; import android.os.Bundle; /** * ClassName:TestTouchEvent * Function: TODO ADD FUNCTION * Reason: TODO ADD REASON * * @author Leon * @version * @since Ver 1.1 * @Date 2011-5-24 */ public class TestTouchEvent extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.test_touch_event); } }
?[Copy to clipboard]Download zuiniuwang.xml
<?xml version="1.0" encoding="utf-8"?> <com.androidtest.touch.test.mylinearlayout android:gravity="center" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <com.androidtest.touch.test.mytestview android:background="#FFFFFF" android:id="@+id/tv" android:layout_height="200px" android:layout_width="200px" android:text="leon" android:textcolor="#0000FF" android:textsize="40sp" android:textstyle="bold"> </com.androidtest.touch.test.mytestview></com.androidtest.touch.test.mylinearlayout>
相关文章推荐
- [android]onTouch事件分发
- 事件分发 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- Android事件分发05——View的onTouchEvent
- 解决Android ScrollView子视图的onTouch事件冲突
- android onTouchEvent 左右手势滑动事件处理
- Android onTouch事件传递机制
- Android中的onTouch()事件如何区分单击事件和滑动事件
- android ListView事件的研究 .
- [安卓]Android onTouch事件解析
- 关于Android中onTouch时间与onClick事件的监听问题
- Android OnTouch事件
- Android onTouch事件传递机制
- Android onTouch事件传递机制
- android View 的ontouch事件传递过程
- 丰富多彩的Android onTouch事件
- 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- 关于Android触摸事件TouchEvent的传递及截取,研究心得。
- Android通过onTouch事件实现单击,双击,长按
- Android中丰富多彩的onTouch事件
- android studio onTouch触摸事件