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

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();
        }
        ...
    }
    

ウォッチフェイスの描画時に適切なデザインを適用するには、メンバー変数 mIsRound および mChinSize の値をチェックします。

ピークカードに対応する

注: ピークカードは Wear 1.x アプリでのみ表示されます。

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

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

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

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

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

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

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

相対単位を使用する

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

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