128x128 のスマートウォッチ画面で適切なレイアウトを取得する際に問題が発生しています。
これは興味深い問題です。時計のレイアウトは、実行中のデバイスから画面密度を明確に継承しているためです。そのため、タブレットとハンドセットで実行すると、時計のレイアウト要素のサイズがまったく異なります。
スマート拡張 SDK のサンプル プロジェクトの 1 つに基づいてレイアウトを作成しています。
このxmlで:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/smart_watch_control_width"
android:layout_height="@dimen/smart_watch_control_height"
android:id="@+id/rlayout"
>
<Button
android:id="@+id/imageViewUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:tag="button"
android:background="@drawable/up_selector" />
...more Buttons
</RelativeLayout>
レイアウトを初期化しています。SmartView は単なる拡張 LinearLayout です。
private LinearLayout createLayout() {
mSmartView = new SmartView(mContext);
mSmartView.setLayoutParams(new LayoutParams(WIDTH, HEIGHT));
LinearLayout sampleLayout = (LinearLayout) LinearLayout.inflate(
mContext, R.layout.xbmc, mSmartView);
sampleLayout.measure(WIDTH, HEIGHT);
Log.i(TAG, "layout width: " + sampleLayout.getMeasuredWidth()
+ " height: " + sampleLayout.getMeasuredHeight());
sampleLayout.layout(0, 0, sampleLayout.getMeasuredWidth(),
sampleLayout.getMeasuredHeight());
return sampleLayout;
}
createLayout の結果は mLayout に格納され、次を使用して描画されます。
Bitmap bitmap = Bitmap.createBitmap(128, 128, BITMAP_CONFIG);
// Set default density to avoid scaling.
bitmap.setDensity(DisplayMetrics.DENSITY_DEFAULT);
Canvas canvas = new Canvas(bitmap);
mLayout.draw(canvas);
showBitmap(bitmap);
上記の XML を使用すると、私のハンドセットでは次のようになります。
タブレットでは次のように表示されます。
また、画像の正確なピクセル値を使用するように XML をハード コードすると、タブレット バージョンのように見えます。矢印の画像は 44px で、中央のものは少し大きくなっています。
デバイスの密度をプログラムで設定して、時計の密度に強制する方法が必要なようです。時計でレイアウトを正しく表示するにはどうすればよいですか? Androidでのやり方ではないので、ピクセル値のハードコーディングを避けることができるソリューションを好むでしょう。