Различное отображение экрана управления SmartWatch

Мое приложение представляет собой простой экран с числами от 1 до 9 в простой сетке 3x3. Вы можете посмотреть, как это выглядит на моих SmartWatch, здесь: https://www.youtube.com/watch?v=ijh5EOTTR-w

Теперь все правильно. Проблема в том, что пользователь сообщил об очень разном отображении одного и того же приложения на своем устройстве, что можно увидеть здесь: https://docs.google.com/open?id=0BwywSxPvL53dcmlwd0RJQWhVa0E

Оба SmartWatch работают на одних и тех же версиях:

  • Умные часы версии 0.1.A.3.7
  • Хост-приложение 1.2.37

Разница только в модели телефона: проблема возникает на Sony Xperia S, а на Sony Xperia Sola все работает нормально. Оба телефона работают под управлением стандартной Android Gingerbread от Sony (на Sola все продолжает нормально работать после обновления до ICS).

Я пробовал указывать размер цифр (текста) по-разному, используя dip, px, mm, но во всех случаях на Sola они были представлены намного меньше по размерам, чем на Xperia S.

Я понятия не имею, что может иметь такое существенное значение, и буду признателен за любые подсказки или помощь. Спасибо!

P.S. Я не использую чертежи.

Вот мой код, чтобы было еще понятнее:

1) Сетка, содержащая значения:

<?xml version="1.0" encoding="utf-8"?>
<!-- px is used since this is a layout for the accessory display. -->
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/smart_watch_control_height"
    android:layout_height="@dimen/smart_watch_control_width" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:ignore="PxUsage">

<GridView
    android:id="@+id/grid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginRight="0px"
    android:layout_marginTop="-13px"
    android:columnWidth="40px"
    android:gravity="center"
    android:horizontalSpacing="0dip"
    android:numColumns="3"
    android:padding="0dip"
    android:stretchMode="none"
    android:verticalSpacing="0dip" />

</RelativeLayout>

2) В каждую ячейку сетки входит один из этих элементов:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="16dip"
    android:textStyle="bold"
    android:textColor="#0000FF"
    android:gravity="center"
    android:padding="0dip"
/>

3) Логика рисования в управлении:

// Create background bitmap for animation.
background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// Set default density to avoid scaling.
background.setDensity(DisplayMetrics.DENSITY_DEFAULT);

LinearLayout root = new LinearLayout(mContext);
root.setLayoutParams(new LayoutParams(width, height));

LinearLayout sampleLayout= (LinearLayout) LinearLayout.inflate(mContext,
        R.layout.speed_dial_control, root);

// draw on the sampleLayout
GridView gridView = (GridView) sampleLayout.findViewById(R.id.grid);
gridView.setAdapter(adapter);

// adjust the size
sampleLayout.measure(width, height);
sampleLayout.layout(0, 0, sampleLayout.getMeasuredWidth(),
    sampleLayout.getMeasuredHeight());

// Draw on canvas
Canvas canvas = new Canvas(background);
sampleLayout.draw(canvas);

// Send bitmap to accessory
showBitmap(background);

person Eir    schedule 16.10.2012    source источник


Ответы (2)


Итак, еще один ответ, поскольку первый ответ все еще актуален - для рисунков.

Прежде всего, вы хотите использовать PX, так как дисплей SmartWatch имеет разрешение 128x128 пикселей. Плотность не следует применять.

Я немного изменил ваш xmls. В основном я удалил ненужные определения.

Сетки:

<?xml version="1.0" encoding="utf-8"?>
<!-- px is used since this is a layout for the accessory display. -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="@dimen/smart_watch_control_height"
    android:layout_height="@dimen/smart_watch_control_width"
    tools:ignore="PxUsage" >

    <GridView
        android:id="@+id/grid"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="3" />

</RelativeLayout>

Как видите, я пропустил большую часть исходного xml. Вам просто нужно определить сетку и количество столбцов. Остальное позаботится само о себе — т.е. сетка будет распределена равномерно в родительском макете (128x128).

Сотовый:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:textColor="#0000FF"
    android:textSize="26px"
    android:textStyle="bold"
    tools:ignore="PxUsage" />

Здесь я изменил textSize на пиксели и удалил отступы, так как вам не нужно их указывать.

Это должно помочь вам. Пробовал на разных моделях телефонов - работает отлично. Если это не так, проблема может быть в вашем адаптере. Для тестирования я использовал простой ArrayAdapter, например:

String[] numbers = new String[] {
        "1", "2", "3", "4", "5",
        "6", "7", "8", "9"
};

ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, R.layout.cell, numbers);

Ваше здоровье!

person Jerker    schedule 23.10.2012
comment
Джеркер, спасибо большое! Эта версия работает нормально! Поля были установлены таким образом, чтобы центрировать макет в целом. - person Eir; 25.10.2012

Чтобы запретить Android применять плотность, попробуйте использовать папку res/drawable-nodpi.

Я думаю, что ваша проблема может быть похожа на этот вопрос.

person Jerker    schedule 17.10.2012
comment
Нет, я не использую чертежи, только файлы макета xml. - person Eir; 18.10.2012
comment
Ok! Вы строите свое изображение (с текстом) так же, как это делается, например. в SampleControlExtension в SDK? т.е. с помощью макета, растрового изображения и холста? Если нет, то посмотрите, может у вас получится лучше. - person Jerker; 18.10.2012
comment
Я следую примерам кода, но не использую растровые изображения. Я разместил код выше. Спасибо за ваш ответ, я надеюсь, что код сделает вещи очень очевидными, и решение будет найдено. - person Eir; 19.10.2012
comment
Ну, размер текста с падением неверен, но вы сказали, что пробовали альтернативы. Я думаю, что px будет правильным. - person Ifor; 22.10.2012