Android事件分发详解(六)——ACTION_DOWN的消费验证
发布日期:2021-06-30 11:16:27 浏览次数:2 分类:技术文章

本文共 7095 字,大约阅读时间需要 23 分钟。

PS:

该系列博客已更新,详情请参见:

http://blog.csdn.net/lfdfhl/article/details/50707742

http://blog.csdn.net/lfdfhl/article/details/50707731

http://blog.csdn.net/lfdfhl/article/details/50707724

http://blog.csdn.net/lfdfhl/article/details/50707721

http://blog.csdn.net/lfdfhl/article/details/50707714

http://blog.csdn.net/lfdfhl/article/details/50707713

http://blog.csdn.net/lfdfhl/article/details/50707700

MainActivity如下:

package cn.c;import android.os.Bundle;import android.app.Activity;import android.view.MotionEvent;/** * Demo描述: * 分析Android事件分发和处理机制 *  * 在该示例中涉及到三个自定义的View.分别是: * 最外层的布局MyFrameLayout * 内层的布局MyLinearLayout * 最里层的自定义按钮MyButton *  * 在dispatchTouchEvent()源码分析中提到一个很重要的东西: * 如果一个View没有处理ACTION_DOWN事件,即对于该事件返回了false(没有消费该事件) * 那么后续的ACTION_MOVE和ACTION_UP均不会再传递到该View;也就是说该View没有了 * 处理ACTION_MOVE和ACTION_UP的资格. * 对于该问题,在此予以验证. *  *  * MyButton的onTouchEvent()方法中直接返回false. * 那么可以看到MyButton只处理了ACTION_DOWN. * 类似的MyFrameLayout和MyLinearLayout对于Touch事件也直接返回了false;他们也就处理不到 * ACTION_MOVE和ACTION_UP *  */public class MainActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        System.out.println("===> MainActivity 中调用 onCreate()");        System.out.println("--------------------------------------------------");    }	    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {    	System.out.println("===> MainActivity 中调用 dispatchTouchEvent()");		System.out.println("===> super.dispatchTouchEvent()默认返回true");		System.out.println("--------------------------------------------------");    	return super.dispatchTouchEvent(ev);    }	@Override	public void onUserInteraction() {		System.out.println("===> MainActivity 中调用 onUserInteraction()");		System.out.println("--------------------------------------------------");		super.onUserInteraction();	}		@Override	public boolean onTouchEvent(MotionEvent event) {		switch (event.getAction()) {		case MotionEvent.ACTION_DOWN:			System.out.println("===> MainActivity 中调用  onTouchEvent()--->ACTION_DOWN");			break;		case MotionEvent.ACTION_MOVE:			System.out.println("===> MainActivity 中调用  onTouchEvent()--->ACTION_MOVE");			break;		case MotionEvent.ACTION_UP:			System.out.println("===> MainActivity 中调用  onTouchEvent()--->ACTION_UP");		default:			break;		}		System.out.println("super.onTouchEvent()默认返回false 表示未消费事件");		System.out.println("--------------------------------------------------");		return super.onTouchEvent(event);	}	}
MyFrameLayout如下:
package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.FrameLayout;public class MyFrameLayout extends FrameLayout{	public MyFrameLayout(Context context, AttributeSet attrs) {		super(context, attrs);	}	@Override	public boolean dispatchTouchEvent(MotionEvent ev) {		//super.dispatchTouchEvent(ev);		System.out.println("外层MyFrameLayout 中调用  dispatchTouchEvent()");		System.out.println("super.dispatchTouchEvent()默认返回true 表示继续分发");		System.out.println("--------------------------------------------------");		return super.dispatchTouchEvent(ev);		//return false;	}		//覆写自ViewGroup	@Override	public boolean onInterceptTouchEvent(MotionEvent ev) {		System.out.println("外层MyFrameLayout 中调用  onInterceptTouchEvent()");		System.out.println("super.onInterceptTouchEvent()默认返回false 表示不拦截");		System.out.println("--------------------------------------------------");		return super.onInterceptTouchEvent(ev);	}	//注意:	//1 ViewGroup是View的子类	//2 ViewGroup中onTouchEvent()方法默认返回的是false	@Override	public boolean onTouchEvent(MotionEvent event) {		//super.onTouchEvent(event);		switch (event.getAction()) {		case MotionEvent.ACTION_DOWN:			System.out.println("外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_DOWN");			break;		case MotionEvent.ACTION_MOVE:			System.out.println("外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_MOVE");			break;		case MotionEvent.ACTION_UP:			System.out.println("外层MyFrameLayout 中调用  onTouchEvent()--->ACTION_UP");		default:			break;		}		System.out.println("super.onTouchEvent()默认返回false 表示未消费事件");		System.out.println("--------------------------------------------------");		return super.onTouchEvent(event);		//return true;	}		}

MyLinearLayout如下:

package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.LinearLayout;public class MyLinearLayout extends LinearLayout {	public MyLinearLayout(Context context, AttributeSet attrs) {		super(context, attrs);	}		@Override	public boolean dispatchTouchEvent(MotionEvent ev) {		//super.dispatchTouchEvent(ev);		System.out.println("内层MyLinearLayout 中调用  dispatchTouchEvent()");		System.out.println("super.dispatchTouchEvent()默认返回true 表示继续分发");		System.out.println("--------------------------------------------------");		return super.dispatchTouchEvent(ev);		//return false;	}		//覆写自ViewGroup	@Override	public boolean onInterceptTouchEvent(MotionEvent ev) {		//super.onInterceptTouchEvent(ev);		System.out.println("内层MyLinearLayout 中调用  onInterceptTouchEvent()");		System.out.println("super.onInterceptTouchEvent()默认返回false 表示不拦截");		System.out.println("--------------------------------------------------");		return super.onInterceptTouchEvent(ev);			}	//注意:	//1 ViewGroup是View的子类	//2 ViewGroup中onTouchEvent()方法默认返回的是false	@Override	public boolean onTouchEvent(MotionEvent event) {		switch (event.getAction()) {		case MotionEvent.ACTION_DOWN:			System.out.println("内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_DOWN");			break;		case MotionEvent.ACTION_MOVE:			System.out.println("内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_MOVE");			break;		case MotionEvent.ACTION_UP:			System.out.println("内层MyLinearLayout 中调用  onTouchEvent()--->ACTION_UP");		default:			break;		}		System.out.println("super.onTouchEvent()默认返回false 表示未消费事件");		System.out.println("--------------------------------------------------");		return super.onTouchEvent(event);	}		}

MyButton如下:

package cn.c;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.Button;public class MyButton extends Button{	public MyButton(Context context, AttributeSet attrs) {		super(context, attrs);	}		@Override	public boolean dispatchTouchEvent(MotionEvent event) {		System.out.println("自定义Button 中调用 dispatchTouchEvent()");		System.out.println("super.dispatchTouchEvent默认返回true");		System.out.println("--------------------------------------------------");		return super.dispatchTouchEvent(event);	}		@Override	public boolean onTouchEvent(MotionEvent event) {		switch (event.getAction()) {		case MotionEvent.ACTION_DOWN:			System.out.println("自定义Button 中调用 onTouchEvent()--->ACTION_DOWN");			break;		case MotionEvent.ACTION_MOVE:			System.out.println("自定义Button 中调用 onTouchEvent()--->ACTION_MOVE");			break;		case MotionEvent.ACTION_UP:			System.out.println("自定义Button 中调用 onTouchEvent()--->ACTION_UP");			break;		default:			break;		}		System.out.println("--------------------------------------------------");		//return false;		return true;	}		}
main.xml如下:

转载地址:https://it9527.blog.csdn.net/article/details/42241083 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android事件分发详解(五)——Touch事件传递验证
下一篇:自定义ContentProvider以及ContentObserver的使用完整详细示例

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月16日 08时11分04秒