Android事件分发是指在Android系统中,当用户触摸屏幕或执行其他操作时,系统如何将这些事件传递给正确的视图或组件进行处理的过程。
创新互联-专业网站定制、快速模板网站建设、高性价比新洲网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式新洲网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖新洲地区。费用合理售后完善,十年实体公司更值得信赖。
Android事件分发遵循一种称为"事件分发机制"的规则,该机制由三个主要的阶段组成:触摸事件的捕获阶段、目标视图的处理阶段和冒泡阶段。
在触摸事件的捕获阶段,事件从顶层视图(如Activity)开始,逐级向下传递,直到找到最底层的子视图。在这个过程中,每个视图都有机会拦截事件,如果某个视图拦截了事件,则后续的视图将无法接收到该事件。
在目标视图的处理阶段,事件被传递给最底层的子视图,并由该视图进行处理。如果该视图没有处理事件,则事件将被传递给其父视图,直到找到能够处理事件的视图为止。
在冒泡阶段,事件从底层视图向上冒泡,直到达到顶层视图。在这个过程中,每个视图都有机会处理事件,如果某个视图处理了事件,则后续的视图将无法接收到该事件。
通过这种事件分发机制,Android系统能够准确地将用户的操作传递给正确的视图或组件进行处理,从而实现了用户与应用程序的交互。在实际开发中,我们可以通过重写视图的相关方法(如onTouchEvent())来自定义事件的处理逻辑,以满足特定的需求。
以上是事件分发中的一些关键对象,它们共同协作,实现了Android中的事件分发机制。
MotionEvent是Android中的一个类,用于处理与用户交互相关的事件,例如触摸屏幕、按下按钮等。它包含了一系列的常量和方法,用于获取事件的类型、坐标、时间等信息。通过监听MotionEvent,开发者可以实现对用户的触摸操作进行响应和处理。
以下是一些常用的MotionEvent方法:
这些方法可以帮助开发者获取触摸事件的相关信息,并进行相应的处理。
MotionEvent#getAction()方法返回一个整数,表示当前触摸事件的类型。具体的类型有以下几种:
这些类型可以通过与MotionEvent类中定义的常量进行比较来判断当前触摸事件的类型。例如,可以使用以下代码来判断当前事件是否为按下事件:
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 处理按下事件的逻辑
}
示例:手指触摸屏幕到离开屏幕事件走向
图片
在Android中,事件分发是通过View的事件分发机制来实现的。当用户触摸屏幕或者进行其他操作时,事件会从顶层的ViewGroup开始向下传递,直到找到合适的View来处理该事件。
Android中的事件分发涉及到以下几个对象:
在事件分发过程中,每个对象都有机会处理事件。如果一个对象处理了事件,那么事件就会停止传递。如果一个对象没有处理事件,那么事件会继续向下传递,直到找到合适的处理者或者事件传递到最底层的View。
可以通过重写View的dispatchTouchEvent()方法来实现事件的分发和传递。在该方法中,可以根据需要调用super.dispatchTouchEvent()方法将事件传递给父View或者调用View的onTouchEvent()方法来处理事件。
Android中的事件分发是通过Activity、Window、View和ViewGroup等对象之间的协作来实现的。每个对象都有机会处理事件,通过合理地重写相关方法,可以实现事件的传递和处理。
从上面的文章中我们得知Android事件分发机制的传递过程可以分为三个阶段:分发、拦截和处理。
Android事件分发机制的传递过程是从上到下的递归过程,事件会依次经过父ViewGroup和子View的拦截判断,最终到达最底层的View进行处理。这个过程中,可以通过重写相关方法来实现事件的拦截和处理,从而实现自定义的交互逻辑。
Activity的事件分发机制是通过ViewGroup和View的层级关系来实现的。当用户触摸屏幕或者按下按键时,系统会将事件传递给当前显示的Activity的根布局ViewGroup,然后由ViewGroup负责将事件分发给各个子View进行处理。
具体的事件分发流程如下:
通过这样的事件分发机制,Android系统可以实现对用户的触摸和按键事件进行灵活的处理,从而实现各种交互效果。
Activity源码:
public boolean dispatchTouchEvent(MotionEvent ev) {
// 开始事件都是Dwon,一般第一次都会进入到onUserInteraction
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
// 若Window返回true,则会告诉Activity也返回true。true在所有touch代表着终止,不再继续往下一个事件传递了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
下面看getWindow().superDispatchTouchEvent(ev); Window是个抽象类,唯一实现类为PhoneWindow,定位到PhoneWindow的superDispatchTouchEvent()。
PhoneWindow的源码:
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
mDecor是DecorView类,DecorView是PhoneWindow类的一个内部类。同时DecorView也是整个Window中的最顶层View。
DecorView是Android中的一个类,它是Android系统中的顶级视图,用于承载应用程序的用户界面。它是Android窗口系统的一部分,负责管理应用程序的窗口和布局。
DecorView是一个特殊的ViewGroup,它包含了应用程序的整个用户界面,包括状态栏、标题栏、内容区域等。它是Android应用程序的根视图,所有其他视图都是DecorView的子视图。
DecorView的主要作用是提供一个容器,用于放置应用程序的布局和控件。它还负责处理用户输入事件,如触摸、滑动等,并将其传递给相应的子视图进行处理。
在Android开发中,我们通常不直接操作DecorView,而是通过Activity或Fragment来管理和操作应用程序的用户界面。DecorView在内部被Activity或Fragment自动创建和管理,开发者只需要关注布局和控件的设计和交互逻辑即可。
DecorView是Android应用程序的根视图,负责承载应用程序的用户界面,并提供容器和事件处理功能。
DecorView是一个特殊的ViewGroup,分发处理同ViewGroup,下面看ViewGroup的superDispatchTouchEvent()
public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
整个Activity事件分发过程如下图:
图片
ViewGroup是一种特殊的View,它可以包含其他的View或者ViewGroup。当用户进行触摸操作时,事件会被传递给ViewGroup,并由ViewGroup负责将事件分发给其子View或者子ViewGroup。
ViewGroup的事件分发机制主要包括以下几过程:
ViewGroup的事件分发机制是通过事件的传递、拦截和处理来实现的。通过重写dispatchTouchEvent()和onInterceptTouchEvent()方法,可以对事件进行自定义的处理。这种机制可以保证事件在ViewGroup及其子View或者子ViewGroup之间的正确传递和处理。
整个ViewGroup分发过程如下图:
图片
View事件分发机制主要包括三个关键方法:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。
View事件分发机制的流程如下:
View#dispatchTouchEvent源码:
public boolean dispatchTouchEvent(MotionEvent event) {
...
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
...
}
只有当4个条件都为真才返回true,否则执行onTouchEvent(),下面对这4个条件逐个分析:
若在setOnTouchListener返回true,就会满足以上4个条件,并且返回了true,从而使得View.dispatchTouchEvent()直接返回true,事件分发结束,不会执行onTouchEvent(event)。
View#onTouchEvent(event)源码:
public boolean onTouchEvent(MotionEvent event) {
...
// clickable代表该控件是否可点击,可点击就进入下面条件判断
if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) {
switch (action) {
// 1. 当前的事件 = 抬起View
case MotionEvent.ACTION_UP:
// 经过种种判断,此处省略
........
if (!focusTaken) {
// 执行performClick()
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
if (!post(mPerformClick)) {
performClickInternal();
}
}
break;
// 2. 当前的事件 = 按下View
case MotionEvent.ACTION_DOWN:
// 经过种种判断,此处省略
break;
// 3. 当前的事件 = 结束事件(非人为原因)
case MotionEvent.ACTION_CANCEL:
// 经过种种判断,此处省略
break;
// 4. 当前的事件 = 滑动View
case MotionEvent.ACTION_MOVE:
// 经过种种判断,此处省略
break;
}
// 若该控件可点击,就一定返回true
return true;
}
// 若该控件不可点击,就一定返回false
return false;
...
}
整个View分发过程如下图:
图片
图片
dispatchTouchEvent用于分发触摸事件。它是ViewGroup类中的一个方法,用于将触摸事件传递给子View或处理自身的触摸事件。
触摸事件的传递是通过触摸事件分发机制来实现的。当用户触摸屏幕时,系统会将触摸事件传递给顶层的ViewGroup,然后由ViewGroup负责将触摸事件传递给子View或处理自身的触摸事件。
dispatchTouchEvent方法的作用是将触摸事件分发给子View或处理自身的触摸事件。它会根据触摸事件的类型和位置来确定是将触摸事件传递给子View,还是处理自身的触摸事件。
在dispatchTouchEvent方法中,会依次调用onInterceptTouchEvent方法和onTouchEvent方法来判断是否拦截触摸事件和处理触摸事件。如果onInterceptTouchEvent方法返回true,则表示拦截触摸事件,不再向子View传递触摸事件;如果onTouchEvent方法返回true,则表示处理了触摸事件,不再向子View传递触摸事件。
onTouchEvent用于处理触摸事件。它是View类的一个成员方法,可以被重写以实现自定义的触摸事件处理逻辑。
触摸事件包括按下(ACTION_DOWN)、移动(ACTION_MOVE)、抬起(ACTION_UP)等多个动作。当用户触摸屏幕时,系统会将触摸事件传递给相应的View,并调用该View的onTouchEvent方法来处理事件。
在onTouchEvent方法中,可以根据不同的触摸动作进行相应的处理,例如根据触摸位置进行绘制、处理滑动事件、处理点击事件等。可以通过重写onTouchEvent方法来实现自定义的触摸交互效果。
重写onTouchEvent方法来处理触摸事件:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 处理按下事件
break;
case MotionEvent.ACTION_MOVE:
// 处理移动事件
break;
case MotionEvent.ACTION_UP:
// 处理抬起事件
break;
}
return true;
}
需要注意的是,onTouchEvent方法的返回值为boolean类型。如果返回true,表示已经处理了该触摸事件,不再向其他View传递;如果返回false,则会将该触摸事件传递给父View或其他相关的View进行处理。
onInterceptTouchEvent用于拦截触摸事件。它通常用于父容器对子View的触摸事件进行拦截和处理。
触摸事件是由屏幕上的触摸点产生的,包括按下、移动和抬起等动作。当一个触摸事件发生时,系统会将该事件传递给最上层的View,并通过dispatchTouchEvent方法进行分发。在分发过程中,如果父容器的onInterceptTouchEvent方法返回true,则表示父容器要拦截该事件,不再将事件传递给子View;如果返回false,则表示父容器不拦截该事件,继续将事件传递给子View。
onInterceptTouchEvent方法的返回值决定了是否拦截触摸事件,它有三种可能的返回值:
通过在onInterceptTouchEvent方法中对触摸事件进行处理,我们可以实现一些特定的触摸事件逻辑,例如滑动冲突处理、多指触摸事件的处理等。
setOnTouchListener是一个用于设置触摸事件监听器的方法,用于对触摸事件进行处理。
使用setOnTouchListener方法,可以为一个控件(如Button、ImageView等)设置一个触摸事件监听器。当用户触摸该控件时,触摸事件监听器会被触发,并执行相应的操作。
示例代码:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 处理触摸事件的逻辑代码
return true; // 返回true表示已经处理了触摸事件,false表示未处理
}
});
button是要设置触摸事件监听器的视图对象。setOnTouchListener方法接受一个View.OnTouchListener对象作为参数,该对象实现了onTouch方法,用于处理触摸事件。
在onTouch方法中,可以编写自定义的触摸事件处理逻辑。根据MotionEvent对象的不同动作(如按下、移动、抬起等),可以执行相应的操作。最后,需要返回一个布尔值,表示是否已经处理了触摸事件。
使用setOnTouchListener方法可以实现各种触摸事件的处理,例如拖动、缩放、滑动等。根据具体需求,可以在onTouch方法中编写相应的代码逻辑。
文章题目:Android事件分发机制
URL地址:http://www.csdahua.cn/qtweb/news25/247825.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网