2014/12/29
Android Wear 5.0 Watch Face API 対応と互換性
Android Wear 5.0 の新しい Witch Face API に載せ替えました。
・3D imclock for Android Wear
・Google play
Activity ではなく Service を使用しています。LiveWallpaper と同じです。
OpenGL 初期化や描画タイミング ( onTimeTick() ) の管理もほぼお任せで、
System UI, Card のレイアウトなどの設定も可能。
新しい API を使用したことで全体的にバッテリー消費量も減りました。
対応する描画モードは 4種類あります。
Protect/LowBit が有効かどうかはデバイス依存で onPropertiesChanged() によって判定します。
OpenGL で直接描画しているため、画面形状への対応も自前で行う必要があります。
丸型かどうかの区別は onApplyWindowInsets() で行います。
Watch Face 以外のアプリでは自分で Listener を登録できます。
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 だけ異なります。
より詳しいスペック比較表は下記よりどうぞ
・Smart Watch のスペック比較
上記のように 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 にゲームを移植
・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 );
~
}
@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();
~
}
@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 );
}
~
}
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 にゲームを移植