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)
より詳しいスペック比較表は下記よりどうぞ
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 だけ 320×290 と画面が横長です。
ただしアプリケーションからは他のデバイス同様 320×320 の正方形画面に見えます。
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 にゲームを移植