ウォッチフェイスに関する問題を解決する

Wear OS by Google のカスタムのウォッチフェイスの作成は、通知やウェアラブル関連のアクティビティの作成とは大きく異なります。このクラスでは、ウォッチフェイスの実装の初心者が直面する可能性がある問題を解決する方法について説明します。

以下の関連リソースもご覧ください。

画面の形状を検出する

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 アプリでのみ表示されます。

ユーザーが通知を受け取ったとき、システム UI のスタイルによっては、通知カードが画面の大部分を覆うことがあります。ウォッチフェイスは、通知カードが表示されている間もユーザーが時刻を確認できるようにすることで、こうした状況に対応する必要があります。

アナログ ウォッチフェイスは、通知カードの表示中に調整を行うことができます。たとえば、ピークカードで覆われていない部分に収まるようにウォッチフェイスを縮小できます。ピークカードで覆われていない領域に時刻を表示するデジタル ウォッチフェイスは、通常は調整を必要としません。ウォッチフェイスを適切に表示できるよう、ピークカードの上の空き領域を特定するには、WatchFaceService.Engine.getPeekCardPosition() メソッドを使用します。

常に画面表示モードでは、ピークカードには透明な背景が設定されます。常に画面表示モードにおいて、ウォッチフェイスでカードの近くに詳細を表示する場合は、ユーザーがカードの内容を読むことができるよう、詳細の上に黒い長方形を描画することを検討してください。

システム インジケーターを設定する

システム インジケーターを表示したままにする場合、画面上のインジケーターの位置と、WatchFaceStyle インスタンスの作成時に背景保護が必要かどうかを設定できます。

  • ステータスバーの位置を設定するには、setStatusBarGravity() メソッドを使用します。
  • 起動ワードの位置を設定するには、setHotwordIndicatorGravity() メソッドを使用します。
  • 半透明のグレーの背景を使用してステータスバーと起動ワードを保護するには、setViewProtection() メソッドを使用します。システム インジケーターは白色のため、ウォッチフェイスに明るい背景が設定されている場合、通常はこのメソッドを使用する必要があります。

システム インジケーターについて詳しくは、システム UI の設定方法デザイン ガイドラインをご覧ください。

相対単位を使用する

Wear OS デバイスの画面のサイズと解像度はメーカーごとに異なります。ウォッチフェイスは、絶対ピクセル数ではなく相対単位を使用することで、こうした違いに対応できます。

ウォッチフェイスを描画する場合、Canvas.getWidth() メソッドと Canvas.getHeight() メソッドを使用してキャンバスのサイズを取得し、検出した画面サイズに対する比率を表す値を使用してグラフィック要素の位置を設定します。ピークカードに対応するためにウォッチフェイスの要素をサイズ変更する場合、カードの上の残領域に対する比率を表す値を使用してウォッチフェイスを再描画します。