Почему 1px иногда 2px, если указано в Android XML? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть желание разделить линию на один пиксель, только для внешности. Я думал, что мог бы сделать это, используя вид высоты 1px, с заданным фоном. Тем не менее, я получаю очень странное поведение на разных устройствах - иногда 1px заканчивается как 2px.

Взять этот пример макета, например:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
    <View android:layout_width="fill_parent" android:layout_height="1px"
        android:background="@android:color/white" android:layout_marginBottom="4dp" />
</LinearLayout>

При запуске на моем G1, это прекрасно . Но на Nexus One чередуется между линиями 1px и 2px .

Кто-нибудь знает, где это происходит неправильно? Почему Android иногда превращает 1 пиксель в 2 пикселя?

Редактировать: Чтобы сделать это абсолютно ясным, мне нет дела до решения моего примера в частности; что меня волнует, так это возможность сказать, что «это представление должно быть высотой 1 пиксель» при любых обстоятельствах, а не только в этом примере.

Ответы [ 3 ]

8 голосов
/ 24 апреля 2010

Вы работаете против SDK 1.5 или устанавливаете Android: anyDensity = "false"? Если ваше приложение не говорит, что оно поддерживает плотности, то Android будет работать в режиме совместимости, где экран будет выглядеть как экран с разрешением mdpi, масштабируя ВСЕ координаты и рисуя, чтобы соответствовать реальной плотности экрана. При использовании экрана hdpi, такого как Droid, это масштабирование в 1,5 раза, поэтому каждый второй «пиксель» будет отображаться на экране двумя пикселями.

Приложения сегодня должны быть написаны для поддержки разных экранов, и в этом случае единицы px и dp будут работать так, как нужно на всех экранах.

1 голос
/ 23 апреля 2010

Я бы предположил, что это происходит, когда линия находится на границе между пикселями;происходит ли это потому, что вы смешиваете пиксельные измерения (независимые от плотности) с абсолютными значениями?Если устройства имеют различное соотношение dp / pixel, ваши поля (определенные в dps) могут размещать ваши разделители на границе между пикселями.

Попробуйте изменить поля на 4px вместо 4dp.

0 голосов
/ 23 апреля 2010

Я знаю, что это не вопрос, но если вы используете ListView, у вас есть некоторые свойства для делителей:

android:divider="" /*color, drawable, etc*/
android:dividerHeight="1dip"

Кроме того, вам действительно не следует использовать пиксели, а нужно измерять плотность независимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...