重要须知:2025年3月5日后,Windows 11上的亚马逊应用商店将不再受支持。请阅读博客文章,了解更多相关信息。
作为Android开发者,您可能已经为多种设备推出了移动应用程序和游戏,但是否考虑过Windows Subsystem for Android™呢? 通过这种新体验,将您的应用程序推向配备了更大屏幕、键盘、触控板和游戏控制器的新桌面客户。
在本文中,我们将介绍如何映射这些设备输入,从而解锁在Windows 11上运行的Android应用的全部功能。 对于以下所有建议,我们建议您在实际设备上进行测试,以确保最佳用户体验。
应用和游戏的输入由所使用的UI工具包确定。在本指南中,我们将重点介绍Android应用中最常用的接口。由虚拟键盘(如EditText)处理的文本输入可与物理键盘无缝协作。
PC游戏通常支持键盘上WASD键的移动。以下代码片段显示了如何检测WASD按键操作以启动子例程:
// WASD控件的Kotlin代码段
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
return when(keyCode) {
KeyEvent.KEYCODE_W-> {
goForward() // 按下W
true
}
}
KeyEvent.KEYCODE_A-> {
turnLeft() // 按下A
true
}
}
KeyEvent.KEYCODE_S-> {
if (event.isShiftPressed) {
crouch() // 按下Shift+S
true
}
else {
goBack() // 按下S
true
}
}
}
KeyEvent.KEYCODE_D-> {
turnRight() // 按下D
true
}
}
else -> super.onKeyUp(keyCode, event)
}
}
UI小组件之间的键盘导航由Android框架处理。如果您创建自定义视图,请确保它可设定焦点并能够处理导航。有关更多信息,请参阅有关焦点处理的Android文档。
对于不可编辑的文本,如果您使用的是Android XML For UI,请考虑将textIsSelectable="true"
添加到TextView
中,使其可供选择。
<TextView
android:id="@+id/imselectable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
在用Jetpack Compose构建应用时,务必添加SelectionContainer
函数,以更利于控制。
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.foundation.text.selection.SelectionContainer
SelectionContainer {
Column {
Text("Text 1")
Text("Text 2")
Text("טקסט 3")
}
}
确保在应用中提供键盘快捷键,因为相比其他输入方式,用户可能更喜欢使用这些快捷键。
可以使用dispatchKeyShortcutEvent()
实现快捷方式,它会拦截所有元键组合,如Alt、Ctrl和Shift。
可以使用KeyEvent
方法检查特定元键:
KeyEvent.isCtrlPressed()
- KeyEvent.isShiftPressed()
- KeyEvent.isAltPressed()
KeyEvent.hasModifiers()
override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
return when (event.keyCode) {
KeyEvent.KEYCODE_F -> {
if (event.isCtrlPressed) {
findAction() // 按Ctrl+F打开查找对话框
true
}
}
else -> {
return super.dispatchKeyShortcutEvent(event)
}
}
}
使用Jetpack Compose,可以定义修饰符:
fun Modifier.interceptKey(key: Key, onKeyEvent: () -> Unit): Modifier {
return this.onPreviewKeyEvent {
if (it.isCtrlPressed && it.key == key && it.type == KeyUp) {
onKeyEvent()
true
} else it.key == key
}
}
...
MyWidget(
... ,
modifier = Modifier
.interceptKey(Key.F) {
findAction() // 按Ctrl+F打开查找对话框
}
)
Windows Subsystem for Android™上的Android应用具有将鼠标和触控板输入与屏幕指针结合的能力。为了增强用户体验,我们建议在应用的UI中支持悬停事件。例如,当指针移动时,您应该直观地突出显示有效和悬停状态小组件。许多常见的小组件(如按钮)已经内置了悬停支持。
右侧是运行在Windows 11上的Android应用中UI元素的有效状态和悬停状态的示例。
处理事件的代码
// Kotlin
yourView.setOnHoverListener { view, event ->
val action = event.actionMasked
when (action) {
ACTION_HOVER_ENTER -> {
// 悬停进入
return@OnHoverListener true
}
ACTION_HOVER_EXIT -> {
// 悬停退出
return@OnHoverListener false
}
}
false
}
对于Jetpack Compose,您可以通过使用`hoverable`
修饰符来处理这些事件:
val interactionSource = remember { MutableInteractionSource() }
val isHovered by interactionSource.collectIsHoveredAsState()
val borderColor = if (isHovered) AmazonOrange else Color.White
Text(
text = "可以悬停",
modifier = Modifier
.hoverable(interactionSource = interactionSource)
.background(borderColor, RectangleShape)
.padding(10.dp)
)
鼠标和触控板用户皆希望有内置鼠标按钮支持。 利用“上下文菜单”,二次点击可调出完整菜单。使用showContextMenu
可以在您的应用中支持二次点击。
yourView.setOnContextClickListener {
showContextMenu()
true
}
有关Jetpack Compose对于二次点击的检测,请查看我们在Stack Overflow上的开发者拥护者代码示例和官方Android文档,了解如何在应用中构建此UI模式的更多信息。