Android UI事件处理

47、Android用户界面设计全解析 本文全面解析了Android用户界面设计的核心概念与实践方法,涵盖视图与视图组的基础知识、常用布局管理器的特点与选择策略、安卓工作室设计工具的使用技巧,以及通过XML、设计工具或Java代码创建界面的对比分析。同时探讨了布局优化、事件处理和交互体验提升的方法,并展望了未来Android UI设计的发展趋势,是Android开发者构建高效、美观、响应式用户界面的实用指南。 阅读详情
在Android平台上,捕获用户在界面上的触发事件有很多种方法,View类就提供这些方法。你在使用各种View视图来布局界面时,会发现几个公用的回调方法来捕捉有用的UI触发事件,当事件在某个View对象上被触发时,这些方法会被系统框架通过这个对象所调用,例如:当一个View(如一个Button)被点击,onTouchEvent()方法会在该对象上被调用,所以,为了捕获和处理事件,必须去继承某个类,并重载这些方法,以便自己定义具体的处理逻辑,显然,你更容易明白,为什么在你使用View类时会嵌套带有这些回调方法的接口类,这些接口称为event listeners,它是你去获取UI交互事件的工具在你继承View类,以便建立一个自定义组,也许你想继承Button , 你会更普遍使用事件监听来捕捉用户的互动,在种情况下,你可以使用类的event handlers.来预定义事件的处理方法。
Event Listeners

View类里的event listener是一个带有回调方法的接口,当UI里的组建是被用户触发时,这些方法会被系统框架所调用

onClick()

来自View.OnClickListener 它会被调用当点击这个Item(在触摸模式),或者当光标聚集在这个Item上时按下“确认”键 ,导航键,或者轨迹球。
onLongClick()

来自View.OnLongClickListener. 它会被调用当长按这个Item(在触摸模式),或者当光标聚集在这个Item上时长按 “确认”键 ,导航键,或者轨迹球。
onFocusChange()

来自View.OnFocusChangeListener 它会被调用当光标移到或离开这个Item,
onKey()

来自View.OnKeyListener..它会被调用,当光标移到这个Item,按下和释放一个按键的时候
onTouch()

来自View.OnTouchListener. 它会被调用 ,在这个Item的范围内点触的时候
onCreateContextMenu()

来自View.OnCreateContextMenuListener. 它会被调用, 当上下文菜单被建立时(由于持续的“长按”) 见讨论Creating Menus更多的信息。
这些方法和嵌套接口类都是一一对应的,如果确定其中一种方法处理你的互动事件,你需要在Activity中实现这个带有这个方法的接口,并把它作为匿名类,然后,通过实例的View.set...Listener() 方法来设置监听器(例如,调用setOnClickListener(),来设置OnClickListener做为监听器)

下面是为一个按钮设置监听器的例子:
// Create an anonymous implementation of 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);
...
}

}
下面这个列子我们会发现用Activity去实现OnClickListener接口,并作为它的一部分,会更方便,而不必去加载额外的类和对象
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表明事件还没有完成,或者它还需要继续被传递给其他的监听器
onKey()
它返回的布尔值表明你已经完成了这个事件的处理,还是应该把它继续传下去。返回true表明已经处理完成并且停止了传递,如果返回为false表明事件还没有完成,或者它还需要继续被传递给其他的监听器
onTouch()
它返回的布尔值表明你是否已经完成了这次事件的行动,重要的是后面可能还有很多后续的行动,这样,如果你返回false,表明在接到下一次的后续行动中,你还没有完成之前行为也没有意向去处理随后的行动,因此,在这个事件的后续行动中将不会再被调用。 如fingure手势,或最终行动事件
记住:我们所关注的事件肯定是发生在高亮聚集的焦点,它从总视图(顶级的)被一级一级的向下传递,直到我们想要关注的组件,当焦点聚集在这个视图(或视图中的子视图)时 ,你能够使用dispatchKeyEvent() 作为一种代替方法,来捕获在视图上的按键事件,你还可以使用onKeyDown()和onKeyUp().来捕获所有事件内的交互活动

注意:在 Android 框架中会调用event handlers先处理事件,然后会适当的传递给二级默认的预定义handlers中;因此 如果返回true,将会停止这个事件的传递,View中默认事件处理方法的回调也会被阻止。因此,当你返回true肯定表明你是要终止这个事件的延续。(这个地方有点不懂。。。原文是:Android will call event handlers first and then the appropriate default handlers from the class definition second. As such, returning true from these event listeners will stop the propagation of the event to other event listeners and will also block the callback to the default event handler in the View. So be certain that you want to terminate the event when you return true.)
Event Handlers

如果您建立一个继承于View自定义组件,然后您可以定义一些回调方法用作默认的事件处理程序。该文件中关于Building Custom Components,您会学习一些共用的回调方法用于事件处理,其中包括:
onKeyDown(int, KeyEvent) - Called when a new key event occurs.
onKeyUp(int, KeyEvent) - Called when a key up event occurs.
onTrackballEvent(MotionEvent) - Called when a trackball motion event occurs.
onTouchEvent(MotionEvent) - Called when a touch screen motion event occurs.
onFocusChanged(boolean, int, Rect) - Called when the view gains or loses focus.

还有其他一些方法,这不属于View类,但可以直接影响到你处理事件的方式,所以在布局内管理更复杂的事件可以考虑到这些方法:
Activity.dispatchTouchEvent(MotionEvent) - This allows your Activity to intercept all touch events before they are dispatched to the window.
ViewGroup.onInterceptTouchEvent(MotionEvent) - This allows a ViewGroup to watch events as they are dispatched to child Views.
ViewParent.requestDisallowInterceptTouchEvent(boolean) - Call this upon a parent View to indicate that it should not intercept touch events with onInterceptTouchEvent(MotionEvent).


Touch Mode


当用户在使用方向键或轨迹球浏览用户界面时,有必要给于一个焦点在可操作的组件上(如一个Button),使用户可以看到它将接受输入命令。如果设备有触摸功能,那么,当用户与界面的交互就不再需要有一个高亮在组件上,或一个焦点在view上,因此,模式的互动名为"触摸模式"。对于一个触摸设备,一旦有用户接触屏幕时,该设备将进入触摸模式.在点触某个View后,只有的它的方法isFocusableInTouchMode()返回为真时,才会有聚集焦点,如文本编辑工具。其他的界面只可以点触,但不会聚集焦点(高亮),如button 被点触时就不会聚集焦点,当它被按下时只会调用on-click监听器的回调方法。
任何时候用户接触方向键或者滚动轨迹球时,该设备将退出触摸模式,并聚集焦点,用户可以恢复与用户界面的键盘交互,而不必在屏幕上。触摸模式的状态是由整个系统来维持的(all windows and activities),要查询目前所处的状态,你可以调用isInTouchMode()方法来获得,看看设备目前是否处于触摸模式。
Handling Focus

系统框架将处理日常的焦点移动来响应用户的输入,它包刮改变焦点(当界面是被移除,隐藏,或者作为一个新的View变为可用状态),通过isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,也可以通过setFocusable().来设置view接受焦点的资格,对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通过setFocusableInTouchMode().来设置是否有焦点来响应点触的资格.

系统框架控制焦点移动到另一个组件的算法是在某一方向上邻近的组件,在极个别情况下,默认的算法可能不符合开发者的预想要求,在这种情况下,你可以覆写下列XML属性的布局文件: nextFocusDown , nextFocusLeft , nextFocusRight ,和nextFocusUp 设置他们的值来明确
焦点从当前界面移动下个界面的Id。例如:
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>

一般来说,在这个垂直布局,浏览的焦点会从第一个按钮开始,不会是从第二个或者其他的,现在topButtont已经通过nextFocusUp (反之亦然)确定了bottom.

通常如果你想宣布用户界面具有焦点的资格 (如果这个界面在传统上是没有的),可以在xml布局里去加上的android:focusable的属性,并设置它的值,您也可以宣布在触摸模式下具有焦点的资格,同样也只在xml里添android:focusableInTouchMode.的属性,并设置它的值. 当用户请求在某个界面聚集焦点时,会调用requestFocus().这个方法。监听到焦点活动(获得焦点或失去焦点都会被通知),会调用onFocusChange(),这个方法,这也是上节所讨论的Event Listeners。
总结:
对于UI控件事件的处理,需要设定相应的监听器,并实现相应的事件处理程序。这儿有两种实现方法:一是定义一个OnClickListener 类的实例,并使用setOnClickListener等绑定监听器;二是用Activity去实现OnClickListener接口,并作为它的一部分,这样会更方便,省去了加载额外的类和对象的时间。
对于支持触摸屏的手机,可以设定触摸模式的UI,可以使用isInTouchMode()来获得触摸模式的状态。
UI处理的另一个重点是焦点的设定及其切换。焦点设置:通过setFocusable或者setFocusableInTouchMode设置可以接受焦点,通过isFocusable或isFocusableInTouchMode获取是否可以接受焦点;焦点切换:编写XML布局文件的nextFocusDown 等属性设置。
android nextFocus使用详解 近期在学习android官方sample,学习到nextFocus的时候花了一些时间,并且也是觉得比较有用,所以拿出来分享。 效果: 立即下载

相关推荐

四自由度机械臂Matlab仿真全流程:从DH参数建模到轨迹规划实战

本文详细介绍了四自由度机械臂在Matlab中的完整仿真流程,从DH参数建模到轨迹规划实战。通过Robotics Toolbox工具,读者可以学习如何构建机械臂模型、验证运动学特性,并实现平滑的轨迹规划。文章还提供了性能优化技巧和常见问题解决方案,帮助开发者高效完成机械臂仿真项目。

weixin_29061041的博客 238

Android中设置焦点规则的nextFocus属性

在电视系统的开发中,不得不提到焦点问题,经常会出现焦点规则不够人性化的问题。layout布局中有nextFocus一类属性可以指定焦点规则,就是说当前获得焦点的控件,如果按遥控器上、下、左、右键后,下个焦点应该落到哪个控件上。此类属性有如下4个(使用时不必全部设置,可按需要使用): nextFocusUp // 指定上键焦点控件 nextFocusDown // 指定下键焦点控件 nextFocu...

冰雪世界 8444

多尺度变换(Multidimensional Scaling ,MDS)详解

介绍多尺度变换基本原理

5216

android 中 焦点控制

android:nextFocusUp- 定义当点up键时,哪个控件将获得焦点 android:nextFocusDown-定义当点down键时,哪个控件将获得焦点 android:nextFocusLeft-定义当点left键时,哪个控件将获得焦点 android:nextFocusRight--定义当点right键时,哪个控件将获得焦点

comikey的专栏 1548

MAX31855电路和程序,实现SPI和软件模拟时序两种方式读取数据

1. 概述 MAX31855为热电偶至数字输出转换器,内置14位模/数转换器(ADC)。器件带有冷端补偿检测和修正、数字控制器、SPI兼容接口,以及相关的控制逻辑,在温度控制器、过程控制或监测系统中设计用于配合外部微控制器(μC)工作。提供多个版本的器件,每个版本针对特定的热电偶类型(K、J、N、T或E型)进行优化和调整。热电偶类型以器件型号后缀表示(例如MAX31855K)。 器件输出14位...

睿思派克 1万+

秋叶ComfyUI整合包使用FRP实现公网访问教程 ComfyUI内网穿透 秋叶整合包

最近在做 ComfyUI 的实验时,我发现很多小伙伴都遇到一个问题:本地启动的 ComfyUI 服务只能在本地访问,想要通过公网远程访问,就必须借助来实现。作为一名前端开发工程师,我花了点时间把 ComfyUI 启动器和 FRP 配置整合了一下,今天就分享给大家。本文适合已经了解。需要注意的是 穿透到公网的话任何人都能访问 为了安全建议看我另一篇帖子加上密码验证 防止恶意攻击。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1351

Android界面设计之创建自定义的控件焦点顺序

我们尝试创建自定义的控件焦点顺序,即同时允许在上面的界面中,当用户按键时,以顺时针或逆时针进行控件切换,如下图:   也就是说,允许用户当按“Down”或“Right”键时,切换顺序是顺时针方向,比如假设当前在键12上,按“Down”或“Right”键时,会切换到键1,而按“Up”或”Left”时,会切换到键11,如此类推。要实现这点,可以在每个按钮中进行设置如下四个属性:  

梵依然的专栏 2967

TPAMI 2024 | 重新思考多焦点图像融合中客观评价指标的有效性:一种基于统计的方法

作为一种延长光学镜头景深(DOF)的有效技术,多焦点图像融合最近成为图像处理社区的一个活跃话题。然而,该领域仍然存在一个未解决的主要问题,即缺乏选择客观评价指标的通用标准。因此,不同研究中使用的指标往往差异显著,导致难以实现公正的评估。为了解决这个问题,本文提出了一种基于统计的方法来验证多焦点图像融合中客观指标的有效性。核心思想是采用统计相关性度量来评估某个融合指标与一些流行的全参考图像质量评估模型之间的性能一致性。

小白学视觉 329

[Android] —> 界面设计基础:控件焦点4个步骤

//--------------------------------------    现在,随着越来越多的Android的应用出现在Android Market上,如何能更加吸引用户成为摆在开发者面前的重要课题。作为Android应用,不仅要在内容上取胜,在比如界面等细节上也要很重视用户的使用体验,如果用户觉得操作困难和不符合操作习惯的话,就会认为应用不好用而不去下载或购买。在用户体验中,一些细...

JC371437557的博客 229

但是我如果真的用差速轮去控制转向 为了尽量原地旋转 转向角度精确 我应该怎么去配置左右两个轮子的速度呢

目标实现方式原地转向左右轮速度相等、方向相反精确角度用 IMU 检测 yaw 实时对齐停止判断达到目标 yaw ± 容差时立即停转控制方式状态机(idle → turning → done)推荐容差2°~3° (可根据实际调整)

qqqweiweiqq的博客 314

NVIDIA Isaac Lab 入门教程(一)

Isaac Lab 是一个用于机器人学习的统一模块化框架,旨在简化机器人研究中的常见工作流程(如 RL、从演示中学习和运动规划)。它建立在英伟达 Isaac Sim 的基础上,利用最新的仿真功能实现逼真的场景和快速高效的仿真。该框架的核心目标是Isaac Lab 的主要功能包括:由 PhysX 提供的快速准确的物理模拟、用于矢量化渲染的平铺渲染 API、用于提高鲁棒性和适应性的域随机化,以及对在云中运行的支持。有关该框架的更多信息,请参阅论文[MYY+23]。

机器人控制与仿真应用 8218

Android TV开发焦点入门

Android TV 开发与一般Android开发最大的区别在于焦点控制 , 用户在使用Android TV设备主要是通过遥控器操作app。焦点就是让用户知道的直接交互行为。 方式一:在xml文件中控制焦点走向 主要是几个属性的使用: focusable:一个控件是否能够获取聚焦 nextFocusRight:按右键要走到的控件ID nextFocusLeft:按左键要走到的控件ID ...

王温暖的博客 1649

置顶必读(1) |《滚雪球学SpringBoot 3.x》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot 3.x》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 12万+

Android用户界面开发:事件处理

事件处理 在Android平台上,捕获用户在界面上的触发事件有很多种方法,View类就提供这些方法。你在使用各种View视图来布局界面时,会发现几个公用的回调方法来捕捉有用的UI触发事件,当事件在某个View对象上被触发时,这些方法会被系统框架通过这个对象所调用,例如:当一个View(如一个Button)被点击,onTouchEvent()方法会在该对象上被调用,所以,为了捕获和处理事件...

acxm45824的博客 220

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android基础————UI控件以及控件事件处理详解

UI控件以及控件事件处理: (1)TextView: 常见属性以: android:textSize 设置文本字体的大小(单位是sp) android:textColor 设置文本的颜色 (通过RGB设置) android:textStyle  设置字体的样式 android:drawableLeft 用于在文本框左侧绘制图片 该属性值可以通过 “@drawable/图片名称”来设

u012369385的专栏 1300

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android开发指南-用户界面-事件处理

处理用户界面事件Handling UI Events在Android上,不止一个途径来侦听用户和应用程序之间交互的事件。对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件。视图类提供了相应的手段。在各种用来组建布局的视图类里面,你可能会注意到一些公共的回调方法看起来对用户界面事件有用。这些方法在该对象的相关动作发生时被Android框架调用。比如,当一个视图(

长空阁 1825

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android--UI组件的事件处理--01

android图形用户界面的开发中组件的的事件处理秉承javase的处理方式和风格。 什么是事件? 3个概念:事件,差别android中并不是所有的事件都被封装为类;事件源;事件处理者; 之间的关系:事件源将事件发送给事件处理器,实际上是委托侦听器,事件处理器对组件生成的事件感兴趣时,注册组件。 实现方式有多种: 1接口事项事件处理模型。 2内部类事件处理模型。用法和场合:将一个侦听器

做最好的自己 814

Android UI布局和事件处理小结

Android布局总结: 1.       布局有直线布局、相对布局、绝对布局、帧布局、表格布局、其他复合布局等。最经常用到的是相对布局,通过相对布局对其他布局进行整合可以得到不同的布局。大部分时候,使用绝对布局不是一个好思路,因为运行Adroid应用的手机往往千差万别,因此屏幕大小、分辨率都存在较大差异,使用绝对布局需要兼顾不同屏幕大小、分辨率问题。针对一个布局用到许多属性,比如:格

yulan1433096363的专栏 1513

android ui事件处理分析

在Android平台上,捕获用户在界面上的触发事件有很多种方法,View类就提供这些方法。你在使用各种View视图来布局界面时,会发现几个公用的回调方法来捕捉有用的UI触发事件,当事件在某个View对象上被触发时,这些方法会被系统框架通过这个对象所调用,例如:当一个View(如一

pgalxx的专栏 796

Android中UI控件的详细介绍(八)——Android事件处理机制的概述

一、概念: 在Android中,我们可以通过事件处理使UI与用户互动。具体形式则是以事件监听器的方式来监听用户的动作。 Android提供了非常好的UI事件处理机制,View是绘制UI的类,每个View对象都可以向Android注册事件监听器。每个事件监听器都包含一个回调方法,这个回调方法的主要工作就是回应或处理用户的操作。 二、Android中常用的事件监听器及其回调方法:

怜星的博客 1138

Android UI事件处理[isInTouchMode()]

谢谢下面的文章   今天解决了一个Android平台下的焦点问题。发现其中关键问题的所在是Android的touchMode。从JavaSwing平台过来的人,都会关注setFocusable()和requestFocus()方法,但是在Android的View中还有另外的两个个方法,setFocusableInTouchMode()和requestFocusFromTouch()方法。这

好好学习,天天向上 7683
上一篇: android ListView详解
下一篇: RelativeLayout常用属性介绍
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值