关于android:是时候为各式设备适配完善的输入支持了

15次阅读

共计 7449 个字符,预计需要花费 19 分钟才能阅读完成。

随着技术提高以及跨平台利用的遍及,您的 Android 利用曾经不再局限于在直板触屏设施运行了。更丰盛的交互方式使得用户可能以更简单的输出形式应用您的利用。所以作为开发者,是时候思考为各种各样的设施提供弱小的输出反对了。本文为您筹备了对于更宽泛、弱小的输出反对的分享,欢迎您浏览。

如果您更喜爱通过视频理解此内容,请在此处查看:

https://www.bilibili.com/vide…

△ 是时候为各式设施适配欠缺的输出反对了

对于各种 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_ENTER
            sendMessage()
            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 ->  // 为视图设置 onHoverListener
    when (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.x
    mouseChangey = motionEvent.y

    // 计算自从上次 motionEvent 事件后的位移
    val totalDistance = hypot(mouseChangeX, mouseChangeY)
    doSomethingCool(totalDistance)
}

手势反对

此外 Android API 还提供了高级指针解决,能够增加手势、双指张合和缩放反对等,如下图所示。

如果您心愿理解更多 Android API 的相干信息,请参阅 Android 开发者网站获取入门指南——应用轻触手势。

触笔输出反对

如果您曾经在利用中增加对指针的杰出反对,那么对于大多数用例来说触控笔通常可能按预期失常工作。对于触控笔的一些加强性能十分值得关注,比方局部设施反对触控笔歪斜和按压,这有助于您在绘画或绘图利用增加一些杰出的控件和性能。此外还有低提早触控笔 API 可让您在绘画或绘图利用中取得最低提早的显示响应,并提供可配置的描边预测,为您打造用笔在纸上绘图的体验。如需理解实际效果,请在受反对的 Chromebook 或 Android 设施上查看相似于 Concepts 的利用。

△ 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 模拟器当初也能够反对多点触控,这让您能够测试须要应用多个手指的手势与利用进行交互,比方双指张合、缩放和其余触摸交互。

△ 在 Google 地图中应用手势操作

这款内置 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 利用,并为其增加了杰出的输出解决!

欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!

正文完
 0