没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:我只采一朵|2014-03-10 14:20:39.000|阅读 228 次
概述:本文详细介绍了Android界面开发中要遇到的事件模型,及Android事件交互,帮助你写出具有出色交互功能的应用。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
一般我们处理事件,都是针对某一个View来处理的,要么是添加onTouchListener监听器,要么继承View然后重写View#onTouchEvent,甚至不用重写,只要使用Widget自己的监听函数 ,或者GestureDetector就OK了。但是理解Android事件模型,对于理解GestureDetector,及Android事件的交互,写出具有出色的交互的应用,都是必经之路。
一:ViewGroup与View的事件模型
我们都知道Android界面实际是一棵View的树。枝干是ViewGroup。ViewGroup继承自View,但是又是管理View的容器。那么ViewGroup与View的事件关系是怎么样的呢?
这需要从另一个重要的ViewGroup中的方法,如下说起:
public boolean onInterceptTouchEvent(MotionEvent ev) { return false; }
它的默认实现很简单,就是把事件交给子View去处理,自己不拦截,Intercept就是拦截的意思。此方法的注释,对于ViewGroup与View的事件模型说得很清楚。
主要是以下几点:
(1) 如果此方法返回false,说明此ViewGroup暂时(只是暂时)对于触控事件不感兴趣。
但是不知道后面的事件它感不感兴趣。所以后续事件还会一直传递到此方法中来,供此方法判断。
(2) 如果此方法返回true了。那么说明此方法对应的ViewGroup开始对于此事件(或者手势)感兴趣了。
那么后续事件就会直接给此方法对应的ViewGroup的onTouchEvent方法来处理事件了。
(3) 如果此方法一开始返回false,说不感兴趣这个时候事件发给了目录View。
现在又返回true,说感兴趣了。那么目录View就会收到一个action为ACTION_CANCEL的事件。
跟此方法返回true时的事件是同一个事件 ,只是action变了。
(4) ViewGroup会在这里接收触控开始的事件。
规则就是上面这些 ,那么是谁在后面处理这些规则呢?就是ViewGroup。它在disptachTouchEvent方法中,进行了一系列的处理来实现这种模型。
public boolean dispatchTouchEvent(MotionEvent ev)
对于单独的View本身来说,它也有一个简单的事件派发模型。通过以下代码就可以很明白的看出来了:
View#dispatchTouchEvent(MotionEvent event):
ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if (onTouchEvent(event)) { return true; }
二: Activity与View的事件模型
事件先到Activity中,然后Activity调用:
/** * Called to process touch screen events. You can override this to * intercept all touch screen events before they are dispatched to the * window. Be sure to call this implementation for touch screen events * that should be handled normally. * * @param ev The touch screen event. * * @return boolean Return true if this event was consumed. */ public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }
先让用户界面窗口处理:getWindow()。superDispatchTouchEvent(ev)。如果窗口没有处理这个事件,那就交给Activity自己处理。return onTouchEvent(ev)
这个Window跟View层级是怎么交互的呢?
我们找到了Window的实现类:PhoneWindow(com.android.internal.policy.impl.PhoneWindow)
@Override public boolean superDispatchTouchEvent(MotionEvent event) { return mDecor.superDispatchTouchEvent(event); }
这个mDecor就是用户界面的根View了。
private final class DecorView extends FrameLayout
(com.android.internal.policy.impl.PhoneWindow.DecorView)
原来窗口将事件交给根View来进行事件派发的。mDecor调用自己的superDispatchTouchEvent(event),然后将事件派发的任务交给了自己的dispatchTouchEvent。
public boolean superDispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); }
这里调用的super.dispatchTouchEvent 就是ViewGroup的声明的dispatchTouchEvent的了.
本文转载自//my.oschina.net/banxi/blog/187178
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@wqylolg.cn
文章转载自:oschinaFastReport .NET 的主要功能之一是能够将多份报告合并为一份。当您需要合并来自不同来源的数据或以更方便的格式呈现信息时,此功能非常有用。在本文中,我们将讨论如何在 FastReport .NET 中将多份报告合并为一份。
本文将手把手教你如何用VMProtect对这一关键函数进行虚拟化保护,大幅提升代码安全性,让逆向工程攻击者无从下手!
在 PDF 文档中添加页眉和页脚有助于保持一致的版式和专业的外观。本文将介绍如何使用 Spire.PDF for Java,通过 Java 在现有的 PDF 文档中添加页眉和页脚,并提供详细的步骤和代码示例。
对于开发人员来说,由于自动化和定制化,通常首选使用编程方法来去除 PDF 中的水印。Aspose.PDF 提供可靠且可定制的解决方案,可无缝集成到各种应用程序中,确保准确性并保持文档完整性。
业内首个高级跨平台原生移动APP开发工具集,支持iOS,Android, Windows Phone和Windows 8
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@wqylolg.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢