提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:我只采一朵|2014-03-10 14:20:39.000|阅读 297 次
概述:本文详细介绍了Android界面开发中要遇到的事件模型,及Android事件交互,帮助你写出具有出色交互功能的应用。
#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>
一般我们处理事件,都是针对某一个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@hmdbvip.cn
文章转载自:oschina



在嵌入式软件测试领域,对交叉编译代码进行单元测试是一大挑战。Parasoft C/C++test作为专业的C/C++测试工具,能够与劳特巴赫Trace32调试器深度集成。下面会详细介绍如何在C++test中配置Trace32调试器,实现对PowerPC架构程序的单元测试,涵盖环境设置、项目导入到测试执行的全过程。
本文将为大家介绍如何使用DevExpress WinForms数据网格控件实现摘要文本的格式化,欢迎下载最新版组件体验!
Parasoft C/C++test作为一款功能强大的自动化测试工具,为嵌入式开发提供了全面的测试解决方案。特别是在CCS开发环境中,C++test能够无缝集成,为F2812等DSP项目提供专业的单元测试支持。下面将介绍如何在CCS3环境下配置和使用C++test进行F2812项目的单元测试。
在嵌入式开发中,尤其是基于ARM架构的安全关键领域,单元测试是验证代码在目标硬件上运行时行为正确性的关键环节,对于保障最终产品的可靠性至关重要。下面将介绍如何利用Parasoft C/C++test开展单元测试,包括配置、执行及解决可能遇到的许可证问题,完成从静态检查到动态运行的完整测试闭环。
相关产品
业内首个高级跨平台原生移动APP开发工具集,支持iOS,Android, Windows Phone和Windows 8
最新文章 MORE
永利最大(官方)网站相关的文章 MORE
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@hmdbvip.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
永利最大(官方)网站