android菜鸟之路-事件分发机制总结(二)

ViewGroup事件分发机制

自己定义一个LinearLayout,ImageView和Button,小二,上代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <com.example.aaaaa.MyLinear
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#956456"
        >
        <com.example.aaaaa.MyImage
        android:id="@+id/id_ll"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:src="@drawable/ic_launcher"
        android:text="click me" />
        <com.example.aaaaa.MyButton
        android:id="@+id/id_btn"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:src="@drawable/ic_launcher"
        android:text="click me" />
    </com.example.aaaaa.MyLinear>
</LinearLayout> 
public class MyLinear extends LinearLayout{
	private static final String TAG =MyLinear.class.getSimpleName();

	public MyLinear(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public MyLinear(Context context) {
		super(context);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "LinearLayout+onTouchEvent ACTION_DOWN");
			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "LinearLayout+onTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "LinearLayout+onTouchEvent ACTION_UP");
			break;
		default:
			break;
		}
		return super.onTouchEvent(event);
	}  

	@Override
	public boolean dispatchTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "LinearLayout+dispatchTouchEvent ACTION_DOWN");
			//			return true;
			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "LinearLayout+dispatchTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "LinearLayout+dispatchTouchEvent ACTION_UP");
			break;  

		default:
			break;
		}
		boolean a=super.dispatchTouchEvent(event);
//		Log.e(TAG, "LinearLayout:a="+a);
		return a;
	}  

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		return super.onInterceptTouchEvent(ev);
	}
}
public class MyButton extends Button
{
	private static final String TAG = MyButton.class.getSimpleName();
	public MyButton(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}  

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "button+onTouchEvent ACTION_DOWN");
			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "button+onTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "button+onTouchEvent ACTION_UP");
			break;
		default:
			break;
		}
		return super.onTouchEvent(event);
	}  

	@Override
	public boolean dispatchTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "button+dispatchTouchEvent ACTION_DOWN");
//			return true;
			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "button+dispatchTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "button+dispatchTouchEvent ACTION_UP");
			break;  

		default:
			break;
		}
		boolean a=super.dispatchTouchEvent(event);
//		Log.e(TAG, "button:a="+a);
		return a;
//		return super.dispatchTouchEvent(event);
	}
}
public class MyImage extends ImageView
{
	private static final String TAG = MyImage.class.getSimpleName();  

	public MyImage(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}  

	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "onTouchEvent ACTION_DOWN");
			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "onTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "onTouchEvent ACTION_UP");
			break;
		default:
			break;
		}
		return super.onTouchEvent(event);
	}  

	@Override
	public boolean dispatchTouchEvent(MotionEvent event)
	{
		int action = event.getAction();  

		switch (action)
		{
		case MotionEvent.ACTION_DOWN:
			Log.e(TAG, "dispatchTouchEvent ACTION_DOWN");
			return false;
//			break;
		case MotionEvent.ACTION_MOVE:
			Log.e(TAG, "dispatchTouchEvent ACTION_MOVE");
			break;
		case MotionEvent.ACTION_UP:
			Log.e(TAG, "dispatchTouchEvent ACTION_UP");
			break;  

		default:
			break;
		}
		boolean a=super.dispatchTouchEvent(event);
//		Log.e(TAG, "ImageView:a="+a);
		return a;
//		return super.dispatchTouchEvent(event);
	}
} 
public class MainActivity extends Activity
{
	protected static final String TAG = "MainActivity";
	private MyImage imageView;
	private MyButton button;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView=(MyImage) findViewById(R.id.id_ll);
		button=(MyButton) findViewById(R.id.id_btn);
		imageView.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Log.e(TAG, "setOnClickListener000");
			}
		});
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Log.e(TAG, "button+setOnClickListener000");
			}
		});

		final LinearLayout ll = (LinearLayout) findViewById(R.id.linear);
//		ll.setOnClickListener(new OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				Log.e(TAG, "LinearLayout+setOnClickListener000");
//			}
//		});
//
		ll.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();  

				switch (action)
				{
				case MotionEvent.ACTION_DOWN:
					Log.e(TAG, "LinearLayout+onTouch ACTION_DOWN");
					Log.e(TAG, "LinearLayout+000"+ll.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_MOVE:
					Log.e(TAG, "LinearLayout+onTouch ACTION_MOVE");
					Log.e(TAG, "LinearLayout+000"+ll.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_UP:
					Log.e(TAG, "LinearLayout+onTouch ACTION_UP");
					Log.e(TAG, "LinearLayout+000"+ll.isClickable());
					break;
				default:
					break;
				}  

				return true;
			}
		});

		imageView.setOnTouchListener(new OnTouchListener()
		{
			@Override
			public boolean onTouch(View v, MotionEvent event)
			{
				int action = event.getAction();  

				switch (action)
				{
				case MotionEvent.ACTION_DOWN:
					Log.e(TAG, "onTouch ACTION_DOWN");
					Log.e(TAG, "000"+imageView.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_MOVE:
					Log.e(TAG, "onTouch ACTION_MOVE");
					Log.e(TAG, "000"+imageView.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_UP:
					Log.e(TAG, "onTouch ACTION_UP");
					Log.e(TAG, "000"+imageView.isClickable());
					break;
				default:
					break;
				}  

				return true;
			}
		});  

		button.setOnTouchListener(new OnTouchListener()
		{
			@Override
			public boolean onTouch(View v, MotionEvent event)
			{
				int action = event.getAction();  

				switch (action)
				{
				case MotionEvent.ACTION_DOWN:
					Log.e(TAG, "button+onTouch ACTION_DOWN");
//					Log.e(TAG, "button+000"+button.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_MOVE:
					Log.e(TAG, "button+onTouch ACTION_MOVE");
//					Log.e(TAG, "button+000"+button.isClickable());
//					return false;
					break;
				case MotionEvent.ACTION_UP:
					Log.e(TAG, "button+onTouch ACTION_UP");
//					Log.e(TAG, "button+000"+button.isClickable());
					break;
				default:
					break;
				}  

				return false;
			}
		});
	}
}

代码都很easy,基本都是信息打印,OK。那我们開始測试吧

假设轻轻点击自己定义Button,并手抖一下。会打印出什么信息呢?让我们来look一look

假设轻轻点击自己定义ImageView。并手抖一下,又会打印出什么信息呢?让我们来look一look

为什么会这样呢?

由于我在自己定义ImageView的dispatchTouchEvent方法里的MotionEvent.ACTION_DOWN事件推断里返回了false,还记得我们上一篇结尾说的么?

***切记,仅仅有每一个ACTION_DOWN。ACTION_MOVE,ACTION_UP事件相应的dispatchTouchEvent方法都返回true。才干依次往后运行,就是说假设dispatchTouchEvent方法里此时的event.getAction()==ACTION_DOWN,
 你返回了false,那么后面的dispatchTouchEvent方法都不会运行(说白了,每一个动作事件都会运行一次dispatchTouchEvent,运行ACTION_DOWN的时候返回了false,后面一系列其他的action就不会再得到运行了,也就是ACTION_MOVE,ACTION_UP事件将不会得到运行。

到了这里我建议先结合两位大神的源代码看看吧

http://blog.csdn.net/guolin_blog/article/details/9153747

http://blog.csdn.net/lmj623565791/article/details/39102591

看完以后再看看这张图,是不是瞬间明确了

实在想不明确的朋友能够把我上面的代码拷过去。依据自己的想法改一改,然后执行执行,非常快你就会豁然开朗

总结:当点击布局里的控件时。首先会调用ViewGroup的dispatchTouchEvent方法,假设onInterceptTouchEvent方法返回的是false,那么就会调用子View的dispatchTouchEvent方法(这种方法返回true就表示子View把事件消费掉了)。假设onInterceptTouchEvent方法返回的是true,那么就会调用ViewGroup的父类(也就是View)的dispatchTouchEvent方法,接下来调用布局的onTouch、onTouchEvent方法。

能够这么记着:布局把事情交给子View处理,子View的dispatchTouchEvent方法返回true表示它把事情干完了,布局就不处理了。假设返回false,就是子View没处理完,那么布局就要处理了。

(再回过头去看  ***切记那里,明确了么?朋友。假设一个事件你返回了false,后面的就是布局在处理了,所以子View后面的事件不会运行)

好吧。我承认这篇写的有点水,事实上主要是提供代码给大家执行着试试。自己动手。丰衣足食。

时间: 2024-10-19 01:56:30

android菜鸟之路-事件分发机制总结(二)的相关文章

Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比方:onTouch和onTouchEvent有什么差别,又该怎样使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?

Android事件分发机制(二)

这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayout.RelativeLayout等都是继承自ViewGroup的.但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能.ViewGroup继承结构示意图如下所

Android中View的事件分发机制

简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由三个函数共同完成: dispatchTouchEvent(DTE) - 进行事件的分发,如果时间能够传递给当前View,该方法会被调用,返回结果受当前view的onTouchEvent, 子View的dispatchTouchEvent影响,表示是否消耗当前事件. onInterceptTouchE

[Android] View和ViewGroup事件分发机制

在android开发中会经常遇到滑动冲突(比如ScrollView或是SliddingMenu与ListView的嵌套)的问题,需要我们深入的了解android事件响应机制才能解决,事件响应机制已经是android开发者必不可少的知识. 1.涉及到事件响应的常用方法构成 用户在手指与屏幕接触过程中通过MotionEvent对象产生一系列事件,它有四种状态: MotionEvent.ACTION_DOWN :手指按下屏幕的瞬间(一切事件的开始) MotionEvent.ACTION_MOVE :手

Android开发之Touch事件分发机制

原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在ViewGroup内,ViewGroup也可以在其他ViewGroup内,这时候把内部的ViewGroup当成View来分析. ViewGroup的相关事件有三个:onInterceptTouchEv

Android中View的事件分发机制——Android开发艺术探索笔记

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50738102 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程,当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发的过程. 涉及到的三个方法 dispatchTouchEvent:用来进行事件的分发,如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEve

图解 Android 事件分发机制

首发原文:http://mp.weixin.qq.com/s?__biz=MzI0MjE3OTYwMg==&mid=2649548149&idx=1&sn=709149df682c7d3a6e453c9ef0626a1f&chksm=f1180e08c66f871eb2e7e39e057a5b090214fd71adcd98aa36b3d7fcecf77ad5d08138c50131#rd 在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用Ima

android 事件分发机制(图文详解)

在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少.废话不多说,总结一句:事件分发机制很重要. Android 事件分发流 关于Android 事件分发机制网上的博文很多,但是很多都是写个Demo然后贴一下输出的Log或者拿源码分析,然后一堆的注释和说明,如果用心的