您的位置:首页 > 移动开发 > Android开发

跟着郭神写博客——Android事件分发机制ViewGroup完全解析

2018-04-03 16:59 489 查看
转载出处:http://blog.csdn.net/guolin_blog/article/details/9153761

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

顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父类或间接父类,像LinearLayout、RelativeLayout等都是继承自ViewGroup的。

但ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。

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

myLayout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TAG", "myLayout on touch");
return false;
}
});
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "You clicked button1");
}
});
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "You clicked button2");
}
});

你会发现,当点击按钮的时候,MyLayout注册的onTouch方法并不会执行,只有点击空白区域的时候才会执行该方法。你可以先理解成Button的onClick方法将事件消费掉了,因此事件不会再继续向下传递。

public boolean onInterceptTouchEvent(MotionEvent ev) {  

    return false;  

}  

public class MyLayout extends LinearLayout {  

  

    public MyLayout(Context context, AttributeSet attrs) {  

        super(context, attrs);  

    }  

      

    @Override  

    public boolean onInterceptTouchEvent(MotionEvent ev) {  

        return true;  

    }  

      

}  

你会发现,不管你点击哪里,永远都只会触发MyLayout的touch事件了,按钮的点击事件完全被屏蔽掉了!这是为什么呢?如果Android中的touch事件是先传递到View,再传递到ViewGroup的,那么MyLayout又怎么可能屏蔽掉Button的点击事件呢?

Android中touch事件的传递,绝对是先传递到ViewGroup,再传递到View的。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐