Android, изображения и dpi

Я использую скин WVGA800 в эмуляторе Android, поэтому плотность (hw.lcd.density) равна 240. Мне нужно поместить 4 кнопки изображения (72 пикселя на дюйм) внизу экрана действий. Поскольку разрешение 480х800, я предположил, что ширина изображения должна быть 120 пикселей. Проблема в том, что при запуске приложения 3 кнопки занимают всю ширину и нет места для 4-й кнопки... Затем я создал изображение кнопки в Fireworks с разрешением 240 пикселей на дюйм и шириной 120 пикселей, но проблема остается. Может ли кто-нибудь объяснить, как сделать правильные рисунки (размеры и dpi), чтобы они могли отображаться пиксель в пикселе на Android?


person StevenR    schedule 22.11.2010    source источник


Ответы (3)


Если вы поместите свои изображения в res/drawable, Android предполагает, что они имеют разрешение 160 точек на дюйм, и соответствующим образом масштабирует их для разных разрешений.

Вы можете либо поместить изображения кнопок в res/drawable-hdpi, сигнализируя, что они предназначены для плотности около 240 точек на дюйм, либо в res/drawable-nodpi, чтобы они никогда не масштабировались независимо от текущей плотности экрана.

Вы по-прежнему ссылаетесь на них как @drawable/whatever в макетах, движок автоматически выбирает наилучшее совпадение.

person SnakE    schedule 25.01.2011

Полностью игнорируйте DPI изображения. Это не имеет значения, все, что вам нужно знать, это размер пикселя. На самом деле я бы предложил создать изображение NinePatch для использования в качестве вашего фон кнопки. На самом деле вам понадобится несколько штук, чтобы поместить их в StateListDrawable, поскольку именно так определяются различные состояния фокуса (например, «Нажато», «Сфокусировано»). Когда у вас есть NinePatch, просто создайте LinearLayout следующим образом:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/my_nine_patch"
        android:text="button 1"
        android:layout_weight="1"
     />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/my_nine_patch"
        android:text="button 2"
        android:layout_weight="1"
     />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/my_nine_patch"
        android:text="button 3"
        android:layout_weight="1"
     />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/my_nine_patch"
        android:text="button 4"
        android:layout_weight="1"
     />
</LinearLayout>

Установите для всех кнопок значение fill_parent и присвойте им всем одинаковый вес. Они будут растягиваться, чтобы равномерно подходить к родителю, и вам не нужно вообще беспокоиться об указании постоянного пикселя или размера наклона. Кроме того, он будет равномерно разделен на любое устройство Android, независимо от разрешения.

person Kevin Coppock    schedule 22.11.2010
comment
1) Как я понимаю разрешение WVGA800 800х480 (высота х ширина). И это разрешение также указано в спецификации HTC Desire (моя тестовая среда). 480, разделенное на 4, равно 120, поэтому ширина каждой кнопки должна составлять 120 пикселей. Как 480 может быть 320 (если так, то действительно в моем случае нет места для 4-й кнопки)? 2) Я стараюсь избегать растягивания, так как мои изображения содержат градиенты, и после растяжения они выглядят размытыми; поэтому вместо растяжения я хочу добиться идеального пикселя в пикселе, по крайней мере, для одного из моих предпочтительных разрешений. Может ли кто-нибудь предоставить больше информации по этому вопросу? - person StevenR; 22.11.2010
comment
Комментарий на 320 пикселей не мой. Теоретически ваши кнопки должны быть 120 пикселей, но имейте в виду отступы между ними, плюс, что происходит, когда пользователь поворачивается в альбомную ориентацию? Вы можете обрабатывать градиенты с 9-патч-изображениями, это немного сложнее. Вот еще немного информации о 9-патчах: forum.xda-developers.com/showthread .php?t=580351 - person Kevin Coppock; 22.11.2010

Ширина на самом деле 320 пикселей, поэтому для 4 кнопок на весь экран установите каждую на 80dip. Затем Android настроит ваши независимые от плотности пиксели на правильный размер экрана 480 пикселей.

person nyusternie    schedule 22.11.2010
comment
Как я уже писал, если устройство 800X480 используется с макетом, где есть 4 кнопки (ImageButton с ресурсами в 72 пикселя / см, стандартное разрешение в Fireworks CS5 и, я также думаю, в Photoshop), каждая шириной 120 пикселей. Если заменить px на dp, то места для моей 4-й кнопки не было и все кнопки были растянуты и размыты. Есть только одно объяснение 1px НЕ 1dp!!! Таким образом, чтобы использовать dp, вы должны разделить px на 1,5. Например, если мое изображение 60 пикселей, я должен использовать 40dp в макете. Этот подход работает и на устройствах с более низким разрешением, например, HTC wildfire — размеры моих кнопок ImageButton были изменены правильно. - person StevenR; 09.09.2011