安卓 Input Events(输入事件)

在安卓中,有不止一种方法从你的应用截取用户交互事件。在你的用户界面中考虑事件,途径就是从用户界面中的一个指定的view对象中捕获事件。该view提供了这样做的方法。

在你用来组成你布局的不同的view类中,你或许注意到了一些公共的回调方法似乎看起来对UI事件有用。这些方法由安卓的框架调用,当各自的操作在对象中发生时。例如,当一个view (一个按钮)被触摸,在这个对象中的onTouchEvent() 方法就会被调用。然而,为了拦截这个事件,你必须继承该类(button )并且重写该方法(onTouchEvent)。然而,为了处理这样的一个事件而继承每一个view对象或许不实际。这就是为什么View 类经常包含一组嵌套的调用接口让你可以跟方便的定义(事件处理方法)。这些接口,叫做事件监听者( event listeners),用来捕获用户与UI的交互。
当你更加平常的为你的用户交互使用事件监听者,当你想继承一个view类,为了创建一个自定义组件,或许可以使用一次。或许你想要继承Button类来让一些东西更加精美。在这样的情况下,你或许需要为你的类定义一个默认事件行为,使用该类的事件处理者(event handlers.).

 事件监听者(Event Listeners)

一个事件监听者是在view类中的一个接口,它包含了一个简单的回调函数。这些方法将会被安卓框架调用,当该view的监听者已经被注册并且通过用户ui 项被触发。
包含了事件监听者接口的都有如下回调方法:
onClick()来自View.OnClickListener.。当用户触摸该item(触摸模式下),或者使用导航键或轨迹球使焦点聚集在该项上并且按下了适当的"enter"(进入)按键或者在轨迹球上执行了按下操作。
onLongClick()来自 View.OnLongClickListener.。当用户持续触摸item时(触摸模式下),或者使用导航键或轨迹球使焦点聚集在该项上并且持续按着适当的"enter"(进入)按键或者在轨迹球上执行持续按下操作(持续一秒)。
onFocusChange()来自 View.OnFocusChangeListener 当用户使用导航键或者轨迹球导航到或者离开该item 时。
onKey()来自View.OnKeyListener. 当用户聚焦在了项目上并且按下或松开设备上的按键时
onTouch()来自View.OnTouchListener.当用户执行一个合格的触摸操作,包括按下,释放或者任何屏幕上的手势动作(在项目的边界内)
onCreateContextMenu()来自View.OnCreateContextMenuListener. 当上下文菜单开始构建时调用(如持续“长按”的结果)。查看在 Menus开发向导中关于上下文菜单的讨论。
这些方法是它们各自接口的唯一方法。为定义其中的一个方法并且处理你的事件,在你的activity中实现嵌套的接口,或者作为一个匿名类定义它。然后,传递一个你的实例引用给各自的View.set...Listener()方法。 method (例如,调用setOnClickListener()并且传递一个你实例化的OnClickListener)
下面一个案例展示了如何为一个按钮注册一个on-click监听者。
// 为OnClickListener创建一个匿名实例
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
 
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}
你可以更加方便的找到实现OnClickListener ,作为activity的一部分。这将会避免额外的类加载和对象分配。如下:
public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
}
 
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
}
...
}
注意上文示例中的onClick() 回调并没有返回值,但是一些其它的事件处理方法必须返回一个布尔类型。原因取决于事件。这里有少数的一些原因:
  • onLongClick() - 该方法返回一个布尔类型来指明你是否消耗了该事件,并且它不应该进一步传递下去。也就是说,返回true表明你处理了该事件并且它应该在这停下来;返回false,如果你没有处理它或者该事件应该继续传递给其它on-click监听者。
  • onKey() - 该方法返回一个布尔类型来表明你是否消耗了该事件并且不应该进一步传递下去。也就是说,返回true表明你处理了该事件并且它应该在这停下来;返回false,如果你没有处理它或者该事件应该继续传递给其它on-click监听者。
  • onTouch() - 该方法返回一个布尔类型来表明你是否消耗了该事件。重要的是该事件可以有多个符合触发条件的操作。因此,当按下事件被接受到,如果你返回了false,表明你没有处理该事件并且对这个事件的后续行动不感兴趣。因此,你不会为每一个操作都调用该事件,如手势动作,或者最后的抬手动作(up action event)。
请记住,硬件按钮事件总是传递给当前焦点视图。从view的顶层开始向下分发,直到到达适当的地方。如果你的view(或者在view中的子view)获得了焦点,之后你可以通过dispatchKeyEvent()方法查看到事件的移动。作为一个备选方法来从你的view中捕获按键事件,你还可以在你activity中的onKeyDown() 和onKeyUp().内收到各种事件。
并且,当你的应用输入文本时,需要注意的是许多设备只有软件的输入方法。这些方法不需要按键支持,或使用声音输入,手写,等等。即使一个输入方法呈现了一个类似键盘的界面,它通常也不会触发onKeyDown()这类的事件。你永远不应该创建UI来约束指定按键的按压,除非你想要限制你应用使用设备的硬件盘。特别的,当用户按下返回按钮时,不要依赖于这些方法来确认输入;改为使用像IME_ACTION_DONE一样的操作来表明该输入方法并且让你的应用程序做出怎样的反应。这可能会以一种有意义的方式来改变它的UI。避免设想一个软件输入方法应该是如何工作的,并且只需要信任它来为你的应用支持已经格式化的文本。
注意:安卓将会首先调用事件处理者,之后调用类中定义的适当的默认处理者。同样的,从这些事件监听者中返回true将会停止事件传播给其它事件监听者,并且阻塞view中的默认事件处理的回调。因此,当你返回true时,确定你想要终止该事件。

 事件处理者(Event Handlers)

如果你想自定义一个view组件,那么你可能会定义一些回调方法作为默认的事件处理者来使用。在Custom Components, 这篇文章中,你将会看到一些被用作事件处理的公共回调函数,包括:
  • onKeyDown(int, KeyEvent) - 当一个新的按键事件发生时调用
  • onKeyUp(int, KeyEvent) - 当一个按键松开(key up )事件发生时调用
  • onTrackballEvent(MotionEvent) - 当一个轨迹球运动事件发生时
  • onTouchEvent(MotionEvent) - 当一个屏幕触摸事件发生时
  • onFocusChanged(boolean, int, Rect) - 当该view获得或失去焦点时
这还有其他的一些你需要注意的方法,它们不是view类的一部分,但是可以直接影响你能处理事件的方式。因此,当在你的布局中管理更多复合事件时,考虑这些方法:
  • Activity.dispatchTouchEvent(MotionEvent) -允许你的activity拦截所有的触摸事件,在他们分发给window之前。
  • ViewGroup.onInterceptTouchEvent(MotionEvent) - 允许一个viewgroup 来观察事件是否派遣给了子view。
  • ViewParent.requestDisallowInterceptTouchEvent(boolean) -调用该方法取决于父视图,表明它不应该通过onInterceptTouchEvent(MotionEvent).拦截触摸事件。

 触摸模式(Touch Mode)

当用户使用方向键或轨迹球在用户界面上移动时,给予活动项(如按钮)焦点是必须的,这样用户可以看见什么输入将会被接受。如果该设备有触摸能力,并且用户开始通过触摸来与界面交互,那么并不需要高亮显示项目,或者给指定view 一个焦点。因此,有一个交互模式叫做“触摸模式”(当今的安卓手机主要是该模式,因它没有硬件输入设备)
对于一个可触摸的设备,移动用户触摸了屏幕,设备将会进入触摸模式。从此刻开始,只有当view因为isFocusableInTouchMode()为true时才可被聚焦,如文本编辑组件。其它view都是可触摸的,如按钮,在触摸时将不会获得焦点;当按下时,他们仅仅的激活他们的on-click 监听者。
任何时候,用户点击一个方向键或滑动轨迹球,设备将会退出触摸模式并且找到一个view使其获得焦点。现在,用户可以继续与用户界面交互,不使用触摸屏幕这种方式。
触摸模式状态一直维持在整个系统中(所有Windows和activitys ).为查询当前状态,你可以调用isInTouchMode() 来查看设备当前是否处于触摸模式。

处理焦点(Handling Focus )

框架将会处理常规响应用户输入时的的焦点移动。这包括当view移除或隐藏时改变焦点,或一个新的view变为可用。view通过isFocusable()方法来表明他们获得焦点的意愿。改变view是否能获得焦点,调用setFocusable()。当处于触摸模式,你或许需要通过isFocusableInTouchMode()查询一个view是否允许聚焦。通过使用setFocusableInTouchMode()你可以改变它。
焦点的移动是基于一个算法的,它顺着一个给定的方向寻找最近的(view)。少数情况下,默认算法或许不符合开发者的要求。在这种情况下,你可以提供详细的覆盖,通过在布局文件中使用如下xml 属性:nextFocusDown,nextFocusLeftnextFocusRight, 和 nextFocusUp。将其中的一个属性添加到view上。该属性的值是下一个需要获取焦点的view的id。如下:
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>
通常,在该垂直布局中,从第一个按钮开始操纵(焦点)将不会跑去任何地方,如果从第二个按钮开始操作,(焦点)也不会跑到它的下面去。现在顶部按钮在底部定义了一个(按钮)同nextFocusUp设置一样(反之亦然),focus  焦点将会上-下 下-上的循环移动。
如果你想要在你UI中什么一个view是可聚焦的(当它一般情况下不是时),为view添加android:focusable xml属性,在你的布局文件中声明。设置该值为true。你也可以声明该view的可聚焦性,当在触摸模式时通过android:focusableInTouchMode.
为请求一个特别的view获得焦点,调用requestFocus()
为监听焦点事件(当一个view获得或失去焦点时通知),使用onFocusChange(),在上文#事件监听者(Event Listeners)中讨论的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】029:栅格重分类案例详解

重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。重分类工具有多种方法将像元值重新分类或更改为替代值,Globalmapper提供了栅格重分类的功能。 文章目录 一、栅格重分类简介二、栅格重分类案例【参考阅读】:ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Re…

Mybatis 和 JPA 用哪个好? 优缺点 ?

本文不会下关于 Mybatis 和 JPA 两个持久层框架哪个更好这样的结论。只是摆事实&#xff0c;讲道理&#xff0c;所以&#xff0c;请各位看官勿喷。 一、事件起因 关于 Mybatis 和 JPA 孰优孰劣的问题&#xff0c;争论已经很多年了。一直也没有结论&#xff0c;毕竟每个人的喜…

SkiaSharp 之 WPF 自绘 五环弹动球(案例版)

此案例基于拖曳和弹动球两个技术功能实现&#xff0c;如有不懂的可以参考之前的相关文章&#xff0c;属于递进式教程。五环弹动球好吧&#xff0c;名字是我起的&#xff0c;其实&#xff0c;你可以任意个球进行联动弹动&#xff0c;效果还是很不错的&#xff0c;有很多前端都是…

【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用)

本文讲述globalmapper软件在无人机航测了内业处理中的应用之:浏览地理照片及航线信息、相机参数、元数据编辑器。 文章目录 1. 航线信息浏览2. 地理图像浏览2.1 数字化工具2.2 要素信息工具2.3 属性表3. 照片原数据编辑1. 航线信息浏览 打开globalmapper软件,加载无人机航测…

Spring Boot 2.7.0发布,2.5停止维护

这几天是Spring版本日&#xff0c;很多Spring工件都发布了新版本&#xff0c; Spring Framework 6.0.0 发布了第 4 个里程碑版本&#xff0c;此版本包含所有针对 5.3.20 的修复补丁&#xff0c;以及特定于 6.0 分支的 39 项修复和改进。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航测内业数据处理中的应用举例

Globalmapper在航测内业数据处理中的应用举例索引。 文章目录 1. 图像及航线浏览2. 3D重建3. 点云分类4. 创建地形5. 地形分析1. 图像及航线浏览 扩展阅读:【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用) 2. 3D重建 从Global Mapper的19版本开始,Pixels-…

移动工具V和选区工具M

移动工具快捷键&#xff1a;V 属性&#xff1a; 自动选择 在默认情况下&#xff0c;移动工具的“自动选择”一项是没有勾选的。表示只能选中图层窗口中选定的固定图层&#xff0c;不能随意的点击选择别的图层。在这里&#xff0c;我们也勾选“自动选择”&#xff0c;可任意选择…

SeleniumWebDriver扩展插件开发

Selenium WebDriver 是一组开源 API&#xff0c;用于自动测试 Web 应用程序&#xff0c;利用它可以通过代码来控制chrome edge等浏览器&#xff01;有时候我们需要mock接口的返回&#xff0c;或者拦截和转发请求&#xff0c;今天就来实现这个功能本插件代码已开源&#xff1a;h…

ZooKeeper的工作原理

ZooKeeper是一个分布式的应用程序协调服务。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子广播&#xff0c;这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab(Zookeeper Atomic Broadcast)协议。Zab协议有两种模式&#xff0c;它们分别是恢复模式&#xff08;…

memcache的学习路线图

memcache学习材料//memcache自带的github 上的 wiki//席剑飞 Memcache&#xff08;MC&#xff09;系列 1~8系列评注&#xff1a; memcache系统写的最深的一博客&#xff0c;建议一读。http://blog.csdn.net/xifeijian/article/details/21994941//mysql与memcache的使用https://…

[转]钱岭:别担心“35岁危机”,要成为“老专家”

从清华大学到贝尔实验室&#xff0c;再到中国移动&#xff0c;作为“IT老人”&#xff0c;钱岭的技术人生几乎覆盖了20世纪90年代至今的信息产业革命。2007年开始&#xff0c;钱岭在中国移动经历了基础科研到产品落地&#xff0c;再到团队孵化&#xff1b;也经历了云计算从无到…

【GIS前沿】周成虎院士:GIS的大数据时代展望(PPT分享)

本文源自微信公众号&#xff1a;宋关福GIS笔记。版权归原作者及刊载媒体所有&#xff0c;如有侵权请立即与我们联系,我们将及时处理。更多GIS前言技术&#xff0c;请关注《GIS前言》专栏。 GIS的大数据时代展望

DataV:可视化大屏展示神器实战分享

由于公司年即将发布新的产品&#xff0c;传统意义上的PPT显得不太生动化&#xff0c;所以想采用具体化&#xff0c;可视化的数据大屏进行业务数据的事实展示&#xff0c;第一时间想到了来自于阿里云旗下的DataV&#xff0c;废话不多说&#xff0c;老司机开始发牌照&#xff01;…

数据库性能系列之索引(中)

GOOD NIGHT前言上一篇中&#xff0c;我们已经了解到了索引的基本概念和一些用法。那索引为什么会提升查询的速度&#xff0c;以及索引究竟是怎么工作的呢&#xff1f;也许大家心里还是有一些迷茫&#xff0c;这一切&#xff0c;还要从索引背后的算法说起。GOOD NIGHT概述大家知…

微服务架构的设计原则和核心话题

目录 一、前言 二、微服务架构的设计原则 1.拆分足够微 2.轻量级通信 3.单一职责原则 4.领域驱动原则 三、微服务架构的核心话题 1.服务拆分 2.服务注册与发现 3.负载均衡 4.API网关 5.服务部署与发布 四、总结 一、前言 毫无疑问&#xff0c;微服务架构的设计原…

4.3.2 基于集合的操作

在SQL Server处理select命令时&#xff0c;会在内存中建立一个结构&#xff0c;以返回结果集。这个结构实质上是一个有行和列的二维数组&#xff0c;称为“游标&#xff08;cursor&#xff09;”。“游标”这个词是“CURrent set of Records(当前记录集)”的缩写。它表示从表或…

Golang GOPATH 包

2019独角兽企业重金招聘Python工程师标准>>> Golang GOPATH & 包的定义 & 包的导入 GOPATH 设置 go 命令依赖一个重要的环境变量&#xff1a;$GOPATH 可以在 .zshrc 配置文件中加上一行这样的配置&#xff0c; export GOPATH/Users/flyme/mygo Go从1.1版本到…

PPK大疆无人机应用教程

文章目录 一、新建项目二、导入数据三、解算过程四、结果导出一、新建项目 新建工程,设置项目名称,保存位置,控制等级,坐标系统(坐标系统选择高斯克吕格,中央子午线根据实际数据所在位置进行选择) 二、导入数据 选择大疆数据,找到对应的文件夹 数据有:图片,EVENT.b…

Eclipse Add generated serial version ID报错解决方案

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; The following problem occurred:Could not find class file.Make sure the file is compilable 解决方案&#xff1a; 1、右键项目 -> Java Build Path -> Source 在Sourcd folders on bui…

开启线程的方式

1、实现Runnable接口 1 package test;2 3 4 5 public class ThreadTest implements Runnable{6 public void tt(){7 Thread t new Thread(this);8 t.start();9 } 10 11 Override 12 public void run() { 13 while(true){ 14 …