处理不同的手表形状

Wear OS 上的应用使用与其他 Android 设备相同的布局技术,但需要根据手表特定的约束条件进行设计。

注意:不要将移动应用的精确功能和 UI 移植到 Wear OS 并期望获得良好的用户体验。

如果您为矩形手持设备设计应用,则屏幕角落附近的内容可能会在圆形手表上被裁剪。如果您使用可滚动的垂直列表,则问题不大,因为用户可以滚动以将内容居中。但是,对于单个屏幕,它可能会提供不良的用户体验。

如果您对布局使用以下设置,则文本在具有圆形屏幕的设备上会显示不正确

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="@string/very_long_hello_world"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

要解决此问题,请在 Wear OS UI 库 中使用支持圆形设备的布局。

  • 您可以使用 BoxInsetLayout 防止视图在圆形屏幕的边缘附近被裁剪。
  • 您可以使用 WearableRecyclerView 在想要显示和操作针对圆形屏幕优化的垂直项目列表时创建弯曲布局。

有关应用设计的更多信息,请阅读 Wear OS 设计指南

使用 BoxInsetLayout

图 2. 圆形屏幕上的窗口内边距。

Wear OS UI 库中的 BoxInsetLayout 类允许您定义适用于圆形屏幕的布局。此类允许您轻松地在屏幕中心或边缘附近对齐视图。

图 2 中的灰色正方形显示了 BoxInsetLayout 在应用所需的窗口内边距后如何在圆形屏幕上自动放置其子视图的区域。要显示在此区域内,子视图使用 layout_boxedEdges 属性指定以下值

  • topbottomleftright 的组合。例如,“left|top”值将子元素的左边缘和上边缘放置在图 2 中的灰色正方形内。

  • "all" 值被使用时,子元素的所有内容都会被放置在图 2 中的灰色方块内。这在包含 ConstraintLayout 的情况下是最常见的方法。

图 2 中显示的布局使用了 <BoxInsetLayout> 元素,并且适用于圆形屏幕。

<androidx.wear.widget.BoxInsetLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:padding="15dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        app:layout_boxedEdges="all">

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="@string/sometext"
            android:textAlignment="center"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:background="@android:color/transparent"
            android:layout_height="50dp"
            android:layout_width="50dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:src="@drawable/cancel" />

        <ImageButton
            android:background="@android:color/transparent"
            android:layout_height="50dp"
            android:layout_width="50dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:src="@drawable/ok" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.wear.widget.BoxInsetLayout>

注意布局中以粗体标记的部分。

  • android:padding="15dp"

    此行将填充应用于 <BoxInsetLayout> 元素。

  • android:padding="5dp"

    此行将填充应用于内部的 ConstraintLayout 元素。

  • app:layout_boxedEdges="all"

    此行确保 ConstraintLayout 元素及其子元素都包含在圆形屏幕上窗口内边距定义的区域内。

使用曲面布局

Wear OS UI 库中的 WearableRecyclerView 类允许您选择针对圆形屏幕优化的曲面布局。要为应用中的可滚动列表启用曲面布局,请参阅 在 Wear OS 上创建列表