Разное отображение экрана управления SmartWatch
Мое приложение представляет простой экран чисел 1-9, в простой сетке 3х3. Вы можете посмотреть, как это выглядит на моем SmartWatch здесь: https://www.youtube.com/watch?v=ijh5EOTTR-w
Теперь это все правильно. Проблема в том, что пользователь сообщил об очень различном отображении одного и того же приложения на своем устройстве, которое можно увидеть здесь: https://docs.google.com/open?id=0BwywSxPvL53dcmlwd0RJQWhVa0E
Обе SmartWatches работают на одинаковых версиях:
- 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.
Я понятия не имею, что может иметь значение для этого, и буду признателен за любые советы или помощь. Спасибо!
PS Я не пользуюсь ничьями.
Вот мой код, чтобы сделать вещи еще яснее:
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);
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. Вам действительно нужно просто определить сетку и количество столбцов. Остальное позаботится само о себе - т.е. сетка будет равномерно распределена в родительском макете (128х128).
Клетка:
<?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);
Ура!
Чтобы Android не применял плотность, попробуйте использовать res/drawable-nodpi
папка.
Я думаю, что ваша проблема может быть похожа на этот вопрос.