开发者控制台

WSA应用UX: 通过Windows Subsystem for Android™️映射设备输入

Giovanni Laquidara Mar 02, 2023
Share:
How to Appstore on Windows 11
Blog_Header_Post_Img

重要须知:2025年3月5日后,Windows 11上的亚马逊应用商店将不再受支持。请阅读博客文章,了解更多相关信息

 

作为Android开发者,您可能已经为多种设备推出了移动应用程序和游戏,但是否考虑过Windows Subsystem for Android™呢? 通过这种新体验,将您的应用程序推向配备了更大屏幕、键盘、触控板和游戏控制器的新桌面客户。

在本文中,我们将介绍如何映射这些设备输入,从而解锁在Windows 11上运行的Android应用的全部功能。 对于以下所有建议,我们建议您在实际设备上进行测试,以确保最佳用户体验。

用键盘输入

应用和游戏的输入由所使用的UI工具包确定。在本指南中,我们将重点介绍Android应用中最常用的接口。由虚拟键盘(如EditText)处理的文本输入可与物理键盘无缝协作。

包含对于‘WASD’键的支持
“WASD”键与箭头键
“WASD”键与箭头键

PC游戏通常支持键盘上WASD键的移动。以下代码片段显示了如何检测WASD按键操作以启动子例程:

Copied to clipboard
// 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文档

example of keyboard navigation GIF

对于不可编辑的文本,如果您使用的是Android XML For UI,请考虑将textIsSelectable="true"添加到TextView中,使其可供选择。

Copied to clipboard
<TextView
    android:id="@+id/imselectable"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

在用Jetpack Compose构建应用时,务必添加SelectionContainer函数,以更利于控制。

Copied to clipboard
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方法检查特定元键:

example of keyboard shortcuts
以Kotlin实现键盘快捷方式
Copied to clipboard
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实现键盘快捷方式

使用Jetpack Compose,可以定义修饰符

Copied to clipboard
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元素的有效状态和悬停状态的示例。

在自定义视图中处理悬停事件
在自定义视图中处理悬停事件

处理事件的代码

Copied to clipboard
// 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`修饰符来处理这些事件:

Copied to clipboard
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可以在您的应用中支持二次点击。

Copied to clipboard
yourView.setOnContextClickListener {
  showContextMenu()
  true
}

有关Jetpack Compose对于二次点击的检测,请查看我们在Stack Overflow上的开发者拥护者代码示例和官方Android文档,了解如何在应用中构建此UI模式的更多信息。

游戏开发输入

对于游戏开发者,在Windows Subsystem for Android™上处理控制器输入对于流畅的游戏体验至关重要。有关如何处理控制器操作的更多信息,请参阅官方文档。

如果您使用Unity开发游戏,您可以使用输入系统映射将每个操作自定义为用户首选的输入系统:

example of input system mapping to customize each action to the user's preferred input system
相关资源

最新文章

 

查看有关亚马逊应用商店、应用开发与盈利、亚马逊服务以及更多主题的最新消息。