移动互联培训

您当前的位置:移动互联培训 > Android开发 >

Android开发教程:View的事件体系

来源:Android开发学习网 2017-03-20

View是一种界面层的控件的一种抽象,它代表了一个控件,今天我们来学习一下View的事件体系。

Android开发教程:View的事件体系
Android开发教程:View的事件体系

没有对点击事件的处理,Activity就是静止的。

首先我们有必要从源头看一下处理分发事件的代码:

public boolean dispatchTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

onUserInteraction();

}

if (getWindow().superDispatchTouchEvent(ev)) {

return true;

}

return onTouchEvent(ev);

}

从代码可知,如果window拦截了事件,那么该事件就交由其进行分发。否则Activity的onTouchEvent就会被调用。PhoneWindow是Window抽象类的唯一实现,我们追踪源码会发现:

@Override

public boolean superDispatchTouchEvent(MotionEvent event) {

return mDecor.superDispatchTouchEvent(event);

}

public boolean superDispatchTouchEvent(MotionEvent event) {

return super.dispatchTouchEvent(event);

}

PhoneWindow将事件直接交由DecorView进行处理。

DecorView是程序员可做处理区域的顶级View,当然不包含状态栏,因为系统似乎并不想让我们对状态栏有任何的染指。DecorView继承自FrameLayout,通过

mDecorView = getWindow().getDecorView();

可以获取。其中

((ViewGroup)mDecorView.findViewById(android.R.id.content)).getChildAt(0);

获取到的View等同我们底下下的rootView

setContentView(rootView);

终事件会从ViewGroup中传到传到我们的View中进行处理;

与事件传递相关的主要有三个方法,其关系如下:

public boolean dispatchTouchEvent(MotionEvent ev) {

boolean consume = false;

if (onInterceptTouchEvent(ev)) {

consume = onTouchEvent(ev);

} else {

consume = child.dispatchTouchEvent(ev);

}

return consume;

400-611-6270

Copyright ©2004-2018 华清远见教育科技集团 版权所有
京ICP备16055225号,京公海网安备11010802025203号