Android Wear 5.0 の新しい Witch Face API に載せ替えました。

3D imclock for Android Wear
Google play

Activity ではなく Service を使用しています。LiveWallpaper と同じです。
OpenGL 初期化や描画タイミング ( onTimeTick() ) の管理もほぼお任せで、
System UI, Card のレイアウトなどの設定も可能。
新しい API を使用したことで全体的にバッテリー消費量も減りました。

対応する描画モードは 4種類あります。

Interactive mode  通常の描画、秒針などアニメーション付き
Ambient mode      スリープ状態、1分に一度の描画更新
Protect mode      Ambient mode 時に描画面積を最小に
LowBit mode       Ambient mode 時に白黒 2階調

Protect/LowBit が有効かどうかはデバイス依存で onPropertiesChanged() によって判定します。

// G2WatchService.java
@Override
public void onPropertiesChanged( Bundle properties )
{
    super.onPropertiesChanged( properties );
    boolean protect= properties.getBoolean( PROPERTY_BURN_IN_PROTECTION, false );
    boolean lowbit=  properties.getBoolean( PROPERTY_LOW_BIT_AMBIENT, false );
    ~
}

OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。

// G2WatchService.java
@Override
public void onApplyWindowInsets( WindowInsets insets )
{
    super.onApplyWindowInsets( insets );
    boolean round_style= insets.isRound();
    ~
}

Watch Face 以外のアプリでは自分で Listener を登録できます。

// GAScreen.java
public class GAScreenView extends GLSurfaceView
          implements View.OnApplyWindowInsetsListener {
    public GAScreenView( Context context ) {
        super( context );
        setOnApplyWindowInsetsListener( this );
    }
    ~
}

Gles2WatchFaceService を使うと簡単に描画できる反面、EGL 初期化は
内部で行われており、任意の GLES Context を選べないなどいくつか制限も出てきます。

im-clock でもいくつか問題が生じていたので、LiveWallpaper のように
GLSurfaceView を使った方法も試しました。
最終的にはデバイス互換性を維持するのが難しくて断念。
結局 Gles2WatchFaceService を使い MSAA は自前で処理しています。

ChiRaKS for Android Wear では Moto 360 で画面が 90度回転してしまうとの報告を
かなり多数いただきました。
原因は Android 版で指定していた screenOrientation="portrait" が残っていたこと。
Moto 360 だけ画面が landscape 扱いとなっているようです。
ちなみに画面だけでなく使用している SoC も Moto 360 だけ異なります。

Device         SoC             GPU             CPU
--------------------------------------------------------------------
Moto 360       TI OMAP3630     PowerVR SGX530  Cortex-A8
LG G Watch 他  Snapdragon 400  Adreno 305      Cortex-A7 (1~4 core)

より詳しいスペック比較表は下記よりどうぞ

Smart Watch のスペック比較

Device             Display              Viewport
-----------------------------------------------------------
Moto 360           320x290 Landscape    (0,-30,320,320)
LG G Watch W100    280x280 Portrait     (0,0,280,280)
Galaxy Gear Live   320x320 Portrait     (0,0,320,320)
LG G Watch R W110  320x320 Portrait     (0,0,320,320)
SmartWatch SWR50   320x320 Portrait     (0,0,320,320)
ZenWatch WI500Q    320x320 Portrait     (0,0,320,320)

上記のように Moto 360 だけ 320x290 と画面が横長です。
ただしアプリケーションからは他のデバイス同様 320x320 の正方形画面に見えます。

OpenGL ES の場合どうやらデフォルトで設定されている Viewport でハードの違いを
吸収しているようです。
OpenGL は左下原点なので y に -30 のオフセットが入っています。
これを知らずに自分で Viewport を設定し (0,0,width,height) で上書きしていたため、
Moto 360 で動かした場合だけ描画が上に 30pix ずれていたことが後から判明しました。
互換性の対処のためにも日本で発売して欲しいデバイスです。


関連エントリ
Android Wear Sony SmartWatch 3 SWR50 は速い
Android Wear 3D のアナログ時計 (Watch Face)
Android Wear にゲームを移植