高考考试网
当前位置: 首页 高考资讯

优化机型适配(是时候为各式设备适配完善的输入支持了)

时间:2023-06-11 作者: 小编 阅读量: 4 栏目名: 高考资讯

目前许多Android设备内置了非触摸输入,比如Chromebook键盘,甚至一些设备将其作为标配提供。△eDJing应用使用场景Cubasis是一款一流的数字音频工作站应用,它发布了基于ChromeOS操作系统优化的新版本,凭借大屏幕的优势以及MIDI控制器连接Chromebook的便利性,不仅增强了功能,还提升了应用实用性。此外请不要忘记使用SPACE以便用空格键来控制播放和暂停。您只需在Android文档中找到正确的键代码,并监听这些按键即可。

随着技术进步以及跨平台应用的普及,您的 Android 应用已经不再局限于在直板触屏设备运行了。更丰富的交互方式使得用户能够以更复杂的输入方式使用您的应用。所以作为开发者,是时候考虑为各种各样的设备提供强大的输入支持了。本文为您准备了关于更广泛、强大的输入支持的分享,欢迎您阅读。

对于各种 Android 设备来说,输入 (input) 是决定用户应用体验的关键要素之一。开发者通常希望用户交互方式能尽可能简单直观,但是假如您新买了一个可折叠设备,附赠了一款键盘,而您喜欢的应用却不支持标准按键操作,这种体验将非常令人沮丧。

目前许多 Android 设备内置了非触摸输入 (non-touch input),比如 Chromebook 键盘,甚至一些设备将其作为标配提供。那么在诸如手机、可折叠设备、平板电脑、Chromebook、支持外接显示屏的 Chromebox、带内置显示器的 Chromebase、Android TV 等各种 Android 设备类型中,开发者应该如何确保不同的输入方式适用于自己的应用。

△ 多种 Android 设备

要知道并非所有的用户都使用手机触摸屏与您的应用交互,一部分用户可能使用的是键盘和触控笔等,甚至一部分用户有 无障碍 需求。那么每位开发者都有必要花些时间去思考,如何使应用为尽可能多的用户带来愉快的使用体验?

增强输入 (Enhanced input)

△ 标准输入方式和增强输入方式

对于每种类型的输入设备,我们可以将应用的功能分为标准用例和增强用例两大类:

  • 标准用例包括选择、文本输入、长按和右键点击等这些用户所期望的功能,处理此类用例的技术实现比较简单且在某些情况下可以自动执行。如果想要为应用提供更多独特和增强的支持,则需要开发者多加考虑。
  • 在增强用例中,某些功能不只是有了更好,而可能是必需具备的,例如一款不支持游戏手柄的手机游戏和一款不支持标准复制和粘贴快捷键的文本编辑器,都是无法受到用户欢迎的。

在提供基础功能外,要考虑添加独特且能为用户提供支持的功能,这才是开发者让自己应用真正脱颖而出的方法。例如,如下所示的 eDJing 这款应用,它添加了对键盘打碟和触控板搓碟以及 MIDI DJ 控制器的支持,用户手中的手机或 Chromebook 就能够立即摇身一变成为 DJ 工作站。

△ eDJing 应用使用场景

Cubasis 是一款一流的数字音频工作站应用,它发布了基于 Chrome OS 操作系统优化的新版本,凭借大屏幕的优势以及 MIDI 控制器连接 Chromebook 的便利性,不仅增强了功能,还提升了应用实用性。

△ Cubasis 应用使用场景

绘图类应用则更加注重: 蓝牙和 USB 绘图板能够持续正常的工作,以及在 Chrome OS 操作系统中将低延迟触控笔 API 应用到绘图和绘画应用中。

△ 绘图类应用使用场景

简而言之,用户希望能在您的应用中获得独特、愉悦、直观的体验,而这种体验由您来打造!

键盘输入支持

键盘被内置在 Chromebook 中,或是成为用户在使用可拆卸设备、平板电脑、可折叠设备和电视过程中日常体验的一部分。好消息是大多数基本键盘输入通常可以直接使用,除非您正致力于构建自己的屏幕键盘或从头开始编写自己的文本输入视图。

发送键支持 (KEYCODE_ENTER)

开发者需要在标准的 EditText 视图中为 Enter 键创建一个新行。如果您的应用中有聊天功能、反馈表单、简报注册或任何需要发送文本的功能,那么默认的换行行为肯定不是您所期望的,不用担心的是您所预期的发送功能很容易实现。

△ 聊天发送文本

开发者需要在标准的 EditText 视图中为 Enter 键创建一个新行,此处显示了按下 Enter 键的代码,完整代码如下所示:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {when (keyCode) {KEYCODE_ENTER -> {// 撤销 onKeyUp 并监听 KEYCODE_ENTERsendMessage()return true// 如果应用已处理按键事件则确保返回 true}}// 如果没有处理事件,则交回系统处理return super.onKeyUp(keyCode, event)// 如果没有则将事件传递给 super}

媒体键支持 (Media key)

如果您的应用希望支持媒体播放,则还需要包含媒体键支持。为此请将 Enter 键代码中的 KEYCODE_ENTER 替换为您希望支持的媒体键代码即可,比如这里使用了 MEDIA_NEXT 和 MEDIA_PREV。此外请不要忘记使用 SPACE 以便用空格键来控制播放和暂停。完整代码如下所示:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {when (keyCode) {KEYCODE_SPACE, KEYCODE_MEDIA_PLAY_PAUSE -> {playOrpauseMedia();return true}KEYCODE_MEDIA_NEXT -> {nextTrack(); return true }KEYCODE_MEDIA_PREV -> {prevTrack(); return true }}// 如果没有处理事件,则交回系统处理return super.onKeyUp(keyCode, event)}

游戏键支持 (KEYCODE_W|A|S|D)

对于游戏应用,您可能希望包括对箭头键和 W、A、S、D 四个按键的支持,这同样很简单。您只需在 Android 文档中找到正确的 键代码,并监听这些按键即可。完整代码如下所示:

when (keyCode) {KEYCODE_W, DPAD_UP -> { goUp(); return true }KEYCODE_A, DPAD_LEFT -> { goLeft(); return true }KEYCODE_S, DPAD_DOWN -> { goDown(); return true }KEYCODE_D, DPAD_RIGHT -> { goRight(); return true }}

需要注意的是在提供键盘支持时通常要监听 onKeyUp,这样您就不必担心在按住某个键时,将会发送重复的 onKeyDown 事件。另外如果您想确保实现毫秒级的时间响应,您可以监听 onKeyDown 并自行处理重复的按键事件。完整代码如下所示:

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {when (keyCode) {KEYCODE_F -> {shootFireball()return true}}return super.onKeyUp(keyCode, event)}

更多相关信息请访问: ChromeOS.dev

快捷键支持 (Ctrl )

除了基本键盘按键,还需要考虑的是配置基于 Ctrl 的快捷键,复制、粘贴、撤消、重做等,很常见的快捷键适用于许多应用。出色的键盘支持将会帮助您的应用实现更多的功能,一些应用甚至更进一步将高级功能放在用户触手可及的地方,比如用户在使用 eDJing 应用时,只需按住 Ctrl 键就可以用触控板搓碟。

如下展示了用于撤消的 Ctrl Z 快捷键的代码,这部分代码类似于前面的 onKeyUp 和 onKeyDown 代码,但使用了 dispatchKeyShortcutEvent 来指示元键组合。请注意此时按下 Alt、Ctrl 或 Shift 键即可触发此操作。完整代码如下所示:

override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {return when (event.getKeyCode()) {KEYCODE_Z -> {undoAction() // [Ctrl] z, [Shift] z, 或 [Alt] z 触发true}else -> {super.dispatchKeyShortcutEvent(event)}}}

如果您只希望响应特定的元键组合,可以使用 Meta_Alt_On,也可以使用类似 isShiftPressed() 或 isCtrlPressed() 的方法。完整代码如下所示:

when {event.isCtrlPressed && event.isShiftPressed -> {redoAction(); true // [Ctrl] [Shift] z 触发}event.isCtrlPressed -> {undoAction(); true //[Ctrl] z 触发}else -> { // 交给系统处理super.dispatchKeyShortcutEvent(event)}}

根据此处代码,只有在同时按下 Ctrl Z 时才会执行撤消操作,同样只有在同时按下 Ctrl Shift Z 时才会执行重做操作,并不会用到 Alt。

鼠标/触控板输入支持

与键盘一样,大多数鼠标和触控板输入通常不需要任何额外的代码就可以工作。但开发者还是有必要使用鼠标测试应用的所有功能,查看是否有任何疏漏。

△ 鼠标

右键点击支持

右键点击是最常见的疏漏之一。触控的一个常见范例是在屏幕上长按以执行基于上下文的操作,但长按鼠标点击并不直观。如果要支持右键点击,此处有几种方案可供选择。此处显示了添加上下文菜单的代码,完整代码如下所示:

registerForContextMenu(myView) // 首先为上下文菜单注册一个或多个视图,这将自动处理长按和右键点击两种操作。...override fun onCreateContextMenu(menu, view, menuInfo) {super.onCreateContextMenu(menu, view, menuInfo)menuInflater.inflater(R.menu.myContextMenu, menu)// 然后撤销 overrideonCreateContextMenu 并扩展正确的菜单布局,同一菜单可用于多个视图。}override fun onCreateContextMenu(item: MenuItem): Boolean {return when(item.itemId){R.id.myMenuItemId -> { menuItemAction(); true }else -> { return super.onContextItemSelected(item) }// 最后,设置 onContextItemSelected 指示选中特定菜单项时需要执行的操作。}}

对于上下文菜单之外的其他右键点击行为,可以用 onContextClickListener 设置视图,只需使用它调用在长按用例中使用的相同方法即可。对应代码如下所示:

myView.setOnContextClickListener {performContextAction()true}

悬停响应支持

用户在使用鼠标或触控板时,通常希望界面能够以某种方式做出响应。例如当鼠标光标悬停在可点击的视图上时会产生视觉反馈,如图所示,可能是指针图标发生了变化,又或者出现一些其他视觉指示,这些都可以被用户直观感受到。此处显示了指针悬停在视图上时的代码,完整代码如下所示:

myView.setOnHoverListener { view, motionEvent ->//为视图设置 onHoverListenerwhen (motionEvent.action) {ACTION_HOVER_ENTER -> {view.pointerIcon = PointerIcon.getSystemIcon(appIicationContext, PointerIcon.TYPE_HAND)view.setBackgroundColor(Color.BLUE)true} // 监听 HOVER_ENTER 事件并执行相应的操作。根据代码显示指针图标将变为手形且背景颜色将变为蓝色。ACTION_HOVER_EXIT -> { resetUI(); }else -> { false }// 不要忘记设置当 HOVER_EXIT 发生时重置图标和背景颜色。}}

指针捕获支持

指针捕获是另一个常见的鼠标和触控板增强功能,不但对于一些游戏至关重要,并且还可以为某些应用添加特定功能。应用能够通过指针捕获功能捕获鼠标光标,使光标不出现在屏幕上,这样无需将光标移动到屏幕边缘就可以接收相对的指针事件。像 Minecraft: 教育版等第一人称视角游戏就是很好的案例。

△ Minecraft: 教育版

要支持指针捕获,可以先调用 requestPointerCapture,然后再调用 releasePointerCapture 释放捕获的指针。在代码中可以添加 OnCapturedPointerListener 使用接收的指针数据,并利用指针位置的相对变化来实现一些很棒的功能。完整代码如下所示:

view.requestPointerCapture()...view.releasePointerCapture()...view.setOnCapturedPointerListener { _, motionEvent ->// 计算自从上次 motionEvent 事件后的坐标增量mouseChangeX = motionEvent.xmouseChangey = motionEvent.y// 计算自从上次 motionEvent 事件后的位移val totalDistance = hypot(mouseChangeX, mouseChangeY)doSomethingCool(totalDistance)}

手势支持

此外 Android API 还提供了高级指针处理,可以添加手势、双指张合和缩放支持等,如下图所示。

如果您希望了解更多 Android API 的相关信息,请参阅 Android 开发者网站获取入门指南——使用轻触手势。

触笔输入支持

如果您已经在应用中添加对指针的出色支持,那么对于大多数用例来说触控笔通常能够按预期正常工作。关于触控笔的一些增强功能非常值得关注,比如部分设备支持触控笔倾斜和按压,这有助于您在绘画或绘图应用添加一些出色的控件和功能。此外还有低延迟触控笔 API 可让您在绘画或绘图应用中获得最低延迟的显示响应,并提供可配置的描边预测,为您打造用笔在纸上绘图的体验。如需了解实际效果,请在受支持的 Chromebook 或 Android 设备上查看类似于 Concepts 的应用。

  • 如需 了解实现细节,请参阅 Android 开发者网站有关 AXIS_PRESSURE 和 AXIS_TILT 的文档。
  • 低延迟触控笔 API 库和演示版应用,请参阅 GitHub。

在 Android 模拟器中使用触控笔

我们与 Microsoft 合作将主机触控笔支持引入 Android 模拟器中,如果您正在优化应用以提供更高级的触控笔支持,那么您将可以在支持的主机上使用 Android 模拟器测试精确的倾斜和按压控制。

Microsoft Surface Duo 开发者体验团队与 Google 合作开展了一项支持高级输入开发和测试的工作,比如多点触控分析和触控笔支持。那么在模拟器中运行应用时如何使用触控笔测试应用?

△ 在模拟器中测试触控笔

如图所示,显示的是 Surface Studio 上运行的 Microsoft Duo 2 模拟器,此刻有两款应用在同时运行: 右侧窗格是示例应用,该示例允许您测试触控笔按压灵敏度、笔方向、擦除笔尖和其他触控笔按钮;左侧窗格是 Microsoft OneNote 应用,使用模拟器可以在 OneNote 画布上绘制、做笔记或擦除。

我们非常兴奋,在支持触控的 PC 上,Android 模拟器现在也可以支持多点触控,这让您可以测试需要使用多个手指的手势与应用进行交互,比如双指张合、缩放和其他触摸交互。

这款内置 Android Studio 的可折叠模拟器正在运行 Google 地图,只需使用两个手指就可以放大和缩小地图。而且这些模拟器更新的不仅是只支持使用两个手指,如果您的硬件允许,可以支持多达 10 个触摸点。

您看到的所有这些变化都不是 Surface Duo 模拟器所特有的,它们也适用于其他可折叠模拟器。Microsoft 也一直在利用这些模拟器更新来开发和优化自己的应用,例如在包括 Surface Duo、大屏幕和其他可折叠设备等多种设备类型上测试触控笔的交互。

手柄输入支持

如果您有一款游戏应用则需要添加游戏手柄支持。使用相应的键代码,确定要对 onKeyUp 还是 onKeyDown 执行操作。

△ 游戏手柄

游戏手柄方向键与键盘箭头键的键代码是相同的,只需监听 KEYCODE_DPAD 事件即可同时处理这两者。游戏手柄按钮也有自己的键代码,您可以监听这些按钮就像这里为 X 按钮进行的设置一样。完整代码如下所示:

when (keyCode) {BUTTON_X -> {engageNitro(); return true}DPAD_UP, KEYCODE_W -> {goForward(); return true}DPAD_LEFT, KEYCODE_A -> {turnLeft(); return true}...}

MIDI 输入支持

当涉及到专门的硬件时,需要针对设备和用例提供支持。MIDI 支持对于音乐和创意工具来说尤其重要,它允许广泛的、富有表现力的输入信号,从对压力敏感的钢琴键盘到具有滑块、旋钮、键盘等许多不同输入触发器的设备,都能提供支持。

如果您希望使用或了解更多 MIDI 相关的信息,Android Media Samples 库中提供了一些便捷的开源示例,可以帮助您开始使用 MIDI。请查看 MidiSynth 项目,特别是该项目中的 Synth Engine 模块。注意,从 Android 29 开始您还可以使用 NDK MIDI API。

回顾

大屏幕的 Android 设备已经出现而且愈发普及,在 Android 上提供出色的输入支持一直很重要,而对于可折叠设备、平板电脑和 Chrome 操作系统来说尤为重要。请思考您应用的输入处理以及如何增加互动、解锁新功能并提升应用体验。期待各位开发者投入精力构建精彩的 Android 应用,并为其添加了出色的输入处理!

欢迎您打开链接:https://go2.gdsub.com/androiddevfb 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

    推荐阅读
  • 法租界探长(租界的巡捕)

    所以有人说“提灯会”也是个“丢孩子的大会”,年年都丢,无一例外。邵居同当镇集主持公道口碑极佳。英租时期的刘公岛警察屋,被老百姓称为“巡捕房”,至今旧迹仍在。此时恰達巡逻的海河。威海卫籍巡捕的这般忠心,似乎使殖民当局也“肃然起敬”。一天晚上李子孝在巡逻时不幸被土匪打死。英国人便抓住这一事件笼络人心。他们给死者安排了隆重的葬礼。这天殖民当局机关停止办公,上下官员全都出来为李子孝送葬。

  • 长了10年的痘痘油性皮肤(油性皮肤就长痘痘)

    这些均有利于面部油分的调节,从而缓解并消除痘痘。需要特别注意的是,护肤品对痤疮只是辅助护理。痘痘作为一种常见皮肤病,应该去正规医院进行治疗,要避免去一些不良美容院而浪费不必要的钱财和时间。

  • 黑枸杞泡水喝有什么功效(黑枸杞泡水喝有哪些功效)

    黑枸杞泡水喝有什么功效加强人体抵抗力、提高睡眠质量,黑枸杞富含花青素,有抗氧化的功效,能把身体里面的自由基消灭掉,从而有效提高身体的抵抗能力。具有补肝肾、明目的作用,黑枸杞内含丰富矿物质、微量元素等多种营养成分,有助于改善因肝血不足以及肾阴亏虚引起的视力昏花、夜盲症等眼部疾病。抗衰老,黑枸杞里面富含大量花青素,有助于清除人体内坏死细胞以及皮肤表面沉淀色素,还可以抗氧化。

  • 人体解剖学4大基本组织(看看人体的组织器官之最)

    看看人体的组织器官之最​1人体最长的神经是坐骨神经2人体最坚强的组织是牙釉质3人体最大的静脉是下腔静脉4全身最粗大的臂丛的分支是桡神经5人体最长的韧带是前纵韧带6全身最长的肌肉是缝匠肌7人体最大的腺体是肝8全身最大的浅静脉。

  • 笑是人生最好的事(笑是人类最美的语言)

    风决定了蒲公英的方向,笑决定了我的心灵,笑的力量,在任何时空,都直抵心灵。笑对人生,笑对风云。有一些人,人间所有苦难与不幸都好像冲他而来,他痛苦,他悲伤,他哭泣,但他却依然地承受下来,微笑着面对自己的人生。最后送上《临江仙·滚滚长江东逝水》与君共赏。滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。

  • 抖音里很火的说说心情短语(抖音里最火的心情说说)

    每一个选择,都是内心的取向。六、对于一个人,我最多认识他两次,初识我愿意相信你是一个满怀善意的好人,第二次是我接受你的辜负,慢走不送,没有第三次。人是会变的,守住一个不变的承诺,却守不住一颗善变的心。从当时的三杯倒到现在喝不醉,这是堕落不是成长。只有让自己更加强大,才能真正地撑起一片天。

  • 京九铁路起点和终点(京九铁路起点和终点讲解)

    京九铁路起点和终点京九铁路起点为北京西站,终点是香港九龙站。京九铁路串联中国华北、华中、华东、华南地区,途径9个省、直辖市,于1996年9月1日全线开通运营。由中铁一局、二局、三局、四局、五局、大桥局、隧道局、电化局集团有限公司参加施工。1996年4月1日全线实现工程临管分流,1996年9月1日交付运营。

  • 很少人知道的古代名菜(奇食之旅江苏徐州名菜)

    此地不但是沛公刘邦的故乡,还是西楚霸王项羽的定都之所,楚风汉韵至今仍影响着徐州人的人生观和价值观。西楚霸王项羽是徐州人千百年来心中的英雄和骄傲,为了纪念他,徐州流传着一道大菜“霸王别姬”。其中的“霸王”指的是项羽,“姬”指的是虞姬。鸡也是同样处理。另外还有红烧的做法,主要食材依然是鳖、鸡。霸王别姬这道菜最大特点是香、鲜、补。甲鱼与鸡炖到一块相得益彰,不仅气味奇香,味道更是鲜嫩无比。

  • 雷丁d70要驾照吗(雷丁d70是否需要驾照详解)

    需要AAABBCC2等级的驾照都可以驾驶,即需要C2级以上的驾照等级,下面我们就来聊聊关于雷丁d70要驾照吗?接下来我们就一起去了解一下吧!雷丁d70要驾照吗需要。车辆分为机动车和非机动车。机动车很复杂,它们内部又细分为很多等级,根据等级的不同,有不同的驾培模式,可以获得相应的驾照级别。一般来说客车为A照,货车为B照,轿车为C照。

  • DNF总是出现第三方如何解决?(看这里)

    下面更多详细答案一起来看看吧!DNF总是出现第三方如何解决出现网络连接中断和公告的弹出窗口时不要点确认。先把网线拔掉,然后在点击任务管理器将TXPlatform.exe和DNF.exe关闭掉,再将游戏根目录里后缀为.keyset的文件删除。用记事本打开DNF_CHINA文件,将里面的文本信息全部删掉。用记事本打开DNF.trc文件,全部删除,再重新创建一个DNF.trc文件。将文件名为BugTrace的文本文档全部都删掉。