解决表盘相关问题

针对 Wear OS by Google 谷歌创建自定义表盘与创建通知和穿戴式设备特定 Activity 截然不同。本课程向您介绍如何解决在实现最初几个表盘时可能会遇到的一些问题。

请参阅以下相关资源:

检测屏幕的形状

一些 Wear OS 设备具有方形屏幕,还有一些设备则具有圆形屏幕。圆形屏幕设备的屏幕底部可能会有插边(俗称“下巴”)。如设计指南中所述,您的表盘应适应并利用屏幕的特定形状。

Wear OS 使表盘可以在运行时确定屏幕形状。如需检测屏幕是方形还是圆形,请按照如下方式在 CanvasWatchFaceService.Engine 类中替换 onApplyWindowInsets() 方法:

Kotlin

    private inner class Engine : CanvasWatchFaceService.Engine() {
        internal var mIsRound: Boolean = false
        internal var chinSize: Int = 0

        override fun onApplyWindowInsets(insets: WindowInsets) {
            super.onApplyWindowInsets(insets)
            mIsRound = insets.isRound
            chinSize = insets.systemWindowInsetBottom
        }
        ...
    }
    

Java

    private class Engine extends CanvasWatchFaceService.Engine {
        boolean mIsRound;
        int chinSize;

        @Override
        public void onApplyWindowInsets(WindowInsets insets) {
            super.onApplyWindowInsets(insets);
            mIsRound = insets.isRound();
            chinSize = insets.getSystemWindowInsetBottom();
        }
        ...
    }
    

如需在绘制表盘时调整您的设计,请检查 mIsRoundmChinSize 成员变量的值。

适应提示卡

注意:提示卡仅出现在 Wear 1.x 应用中。

当用户收到通知时,通知卡可能会覆盖大部分的屏幕空间,具体取决于系统界面样式。表盘应适应这些情况,确保用户在通知卡出现时仍能看到时间。

出现通知卡时,模拟表盘可以做出调整(如缩小表盘),使表盘位于提示卡未覆盖的屏幕部分内。在提示卡片未覆盖的屏幕区域显示时间的数字表盘通常不需要调整。要确定提示卡上方的可用空间,以便调整表盘主题,请使用 WatchFaceService.Engine.getPeekCardPosition() 方法。

在微光模式下,提示卡具有透明背景。在微光模式下,如果表盘包含的一些详细信息在卡片附近,不妨考虑在其周围绘制一个黑色矩形,以确保用户能够看清卡片的内容。

配置系统指示器

如需确保系统指示器保持可见状态,可以在创建 WatchFaceStyle 实例时配置它们在屏幕上的位置以及它们是否需要背景保护:

  • 如需设置状态栏的位置,请使用 setStatusBarGravity() 方法。
  • 如需设置启动指令的位置,请使用 setHotwordIndicatorGravity() 方法。
  • 如需以半透明灰色背景保护状态栏和启动指令,请使用 setViewProtection() 方法。如果表盘的背景为浅色,通常有必要进行此设置,因为系统指示器为白色。

如需详细了解系统指示器,请参阅配置系统界面设计指南

使用相对测量值

不同制造商的 Wear OS 设备的屏幕尺寸和分辨率各不相同。您的表盘应通过使用相对测量值(而不是绝对像素值)来适应这些变化。

在绘制表盘时,您可以使用 Canvas.getWidth()Canvas.getHeight() 方法获取画布的大小,并使用属于所检测屏幕大小一部分的值来设置图形元素的位置。如果您调整表盘元素的大小以适应提示卡,请使用属于提示卡上方剩余空间范围内的值重新绘制表盘。