事件分发机制完全解析_下

Posted 杨伟乔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件分发机制完全解析_下相关的知识,希望对你有一定的参考价值。

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761

记得在前面的文章中,我带大家一起从源码的角度分析了androidView的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了。

还未阅读过的朋友,请先参考 Android事件分发机制完全解析,带你从源码的角度彻底理解(上) 

那么今天我们将继续上次未完成的话题,从源码的角度分析ViewGruop的事件分发。

首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别?

顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayoutRelativeLayout等都是继承自ViewGroup的。但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。ViewGroup继承结构示意图如下所示:

 

可以看到,我们平时项目里经常用到的各种布局,全都属于ViewGroup的子类。

简单介绍完了ViewGroup,我们现在通过一个Demo来演示一下AndroidVewGroup的事件分发流程吧。

首先我们来自定义一个布局,命名为MyLayout,继承自LinearLayout,如下所示:

[java] view plaincopy

  1. public class MyLayout extends LinearLayout {  
  2.   
  3.     public MyLayout(Context context, AttributeSet attrs) {  
  4.         super(context, attrs);  
  5.     }  
  6.   
  7. }  

然后,打开主布局文件activity_main.xml,在其中加入我们自定义的布局:

[html] view plaincopy

  1. <com.example.viewgrouptouchevent.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/my_layout"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/button1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="Button1" />  
  13.   
  14.     <Button  
  15.         android:id="@+id/button2"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="Button2" />  
  19.   
  20. </com.example.viewgrouptouchevent.MyLayout>  

可以看到,我们在MyLayout中添加了两个按钮,接着在MainActivity中为这两个按钮和MyLayout都注册了监听事件:

[java] view plaincopy

  1. myLayout.setOnTouchListener(new OnTouchListener() {  
  2.     @Override  
  3.     public boolean onTouch(View v, MotionEvent event) {  
  4.         Log.d("TAG""myLayout on touch");  
  5.         return false;  
  6.     }  
  7. });  
  8. button1.setOnClickListener(new OnClickListener() {  
  9.     @Override  
  10.     public void onClick(View v) {  
  11.         Log.d("TAG""You clicked button1");  
  12.     }  
  13. });  
  14. button2.setOnClickListener(new OnClickListener() {  
  15.     @Override  
  16.     public void onClick(View v) {  
  17.         Log.d("TAG""You clicked button2");  
  18.     }  
  19. });  

我们在MyLayoutonTouch方法,和Button1Button2onClick方法中都打印了一句话。现在运行一下项目,效果图如下所示:

分别点击一下Button1Button2和空白区域,打印结果如下所示:

iossu ti/jidNGNZ3/J08yC1dNv9v8AAAA//8DAFBLAwQUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAF9y ZWxzLy5yZWxzhI/NCsIwEITvgu8Q9m7TehCRpr2I4FX0AdZk2wbbJGTj39ubi6AgeJtl2G9m6vYx jeJGka13CqqiBEFOe2Ndr+B03C3WIDihMzh6RwqexNA281l9oBFTfuLBBhaZ4ljBkFLYSMl6oAm5 8IFcdjofJ0z5jL0MqC/Yk1yW5UrGTwY0X0yxNwri3lQgjs+Qk/+zfddZTVuvrxO59CNCmoj3vCwj MfaUFOjRhrPHaN4Wv0VV5OYgm1p+LW1eAAAA//8DAFBLAwQUAAYACAAAACEA+JYdxJEDAAAmBwAA HwAAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWykVd2K20YUvi/0HcRALrWSbMmWRbTp rn9CYJMscfbOUMajsTXd0Yw6M/5LKfSukAcIvSgUSqGUXrRXhSb0bbob+hY9M7LX3t3Si0QX9pkz c775zs8nPXy0rri3pEozKXIUHYXIo4LIgol5ji5ejvwUedpgUWAuBc3Rhmr06PjTTx7ibK5wXTLi AYLQGc5RaUydBYEmJa2wPpI1FbA3k6rCBpZqHhQKrwC54kErDDtBhZlAx3uoATbYWyj2AVBckkta 9LFYYg2QnGSHni1HTj4eGWdi+VjV4/pcWebk2fJceazIEVRO4ApKhILtxvYYLIM7UfM9wHqmKnte zmbe2qFs7K/DoGvjEXC2wzgNAZ/A1tZu7iif/0cUKYf/GwdkmkvBOCCia0tDLO9nFt2k9v6HX67+ +tGzjoJqonJUXWafPR0/eTk2UtGsn00uNAzTZIPFfDUZUH1pZD25fvP71bu312++/fvdH1c//TmB cVKSFf/8+t37tz9fv/7m+vvfjkhZZVnQjtOkiNptPy6m8NPpEn+azojfTZJuGnZaaYjTz2eMUw0T FLXB04viGMqTdpMHyTR6kBRHX9TzmxbsktH1GQyI9oTsl0CNnuiaEgMDD03buZSSq5LiQlt30zTo boPgGrgHg5ZPV09lAd3GCyPdDH94I28agrNaafOYysqzRo4UkHTgeHmmTcNpd8R1S44Y524WuLjl AMzGAzMEoXbPTpMT11e9sDdMh2nsx63O0I/DwcA/GfVjvzOKusmgPej3B9HX9t4ozkpWFFTYa3ZC j+J7KqoYUVLLmTkisgpglBmhO

以上是关于事件分发机制完全解析_下的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Android触摸事件分发机制完全解析《一》

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

Android 源码解析View的touch事件分发机制