XML-макет на Sony SmartWatch
У меня проблемы с получением правильного макета на экране SmartWatch 128x128.
Это интересная проблема, потому что расположение на часах явно наследует плотность экрана от устройства, на котором они работают. Таким образом, при запуске на планшете против телефона элементы макета на часах имеют совершенно разные размеры.
Я строю свой макет на одном из примеров проектов в SDK для интеллектуальных расширений.
С этим 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.
1 ответ
Попробуйте сохранить свои рисованные объекты в папке res/drawable-nodpi, что не позволит Android применять плотность.
Это, например, сделано в 8 играх-головоломках, которые доступны здесь.