Я использую скин WVGA800 в эмуляторе Android, поэтому плотность (hw.lcd.density) составляет 240. Я должен положить 4 кнопки изображения (72 пикселя на дюйм) внизу представления активности. Поскольку разрешение 480X800, я подсказал, что ширина изображения должна быть 120 пикселей. Проблема заключается в том, когда приложение запущено, 3 кнопки занимают всю ширину, и нет места для 4-й кнопки ... Затем я создал изображение кнопки в Fireworks с разрешением 240 пикселей на дюйм и шириной 120 пикселей, но проблема остается. Может ли кто-нибудь объяснить, как сделать правильные чертежи (размеры и dpi), чтобы они отображались в пикселях на Android?Android, изображения и dpi
ответ
Ширина на самом деле составляет 320 пикселей, поэтому для 4 кнопок по всему экрану каждый из них равен 80dip. Затем Android отрегулирует ваши независимые от плотности пиксели до необходимого размера экрана 480 пикселей.
Пренебрежение изображением 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, независимо от разрешения.
1) Как я понимаю, разрешение WVGA800 составляет 800X480 (высота x ширина). И эта резолюция также упоминается в спецификации HTC Desire (мой тест env). 480 diveded by 4 равно 120, поэтому каждая кнопка должна быть 120 пикселей в ширину. Как 480 может быть 320 (если так, то действительно в моем случае нет места для 4-й кнопки)? 2) Я стараюсь избегать «растяжения», так как мои изображения содержат градиенты, и после растяжения они выглядят размытыми; поэтому insted «растяжения» Я хочу достичь идеального пикселя в пикселе, по крайней мере, для одного моего предпочтительного разрешения. Может ли кто-нибудь предоставить дополнительную информацию по этому вопросу? – StevenR
Комментарий 320 пикселей не был моим. Теоретически ваши кнопки должны быть 120 пикселей, но имейте в виду и прокладку между ними, плюс, что происходит, когда пользователь поворачивается в альбомную ориентацию? Вы можете обрабатывать градиенты с 9-патч-изображениями, это немного немного сложнее. Вот еще одна информация о 9-патчах: http://forum.xda-developers.com/showthread.php?t=580351 – kcoppock
Если вы разместите свои изображения в res/drawable
, Android предполагает, что они предназначены для 160dpi и соответственно масштабируют их для разных разрешений.
Ваши варианты - либо поставить изображения кнопок в res/drawable-hdpi
, сигнализируя, что они предназначены для плотностей около 240 точек на дюйм, либо в res/drawable-nodpi
, чтобы они никогда не масштабировались независимо от текущей плотности экрана.
Вы все еще ссылаетесь на них как @drawable/whatever
в макетах, двигатель выбирает наилучшее соответствие автоматически.
Как я писал, если устройство 800X480 используется с макетом, где находятся 4 кнопки (ImageButton с ресурсами в 72 пикселя/см, стандартное разрешение в Fireworks CS5 и я также верю в Photoshop), каждая ширина 120 пикселей. Если px заменяется на dp, тогда не было места для моей 4-й кнопки, и все кнопки были растянуты и размыты. Существует только одно объяснение: 1px IS NOT 1dp !!! Поэтому, чтобы использовать dp, вам нужно разделить px на 1.5. Например, если мое изображение 60 пикселей, я должен использовать 40dp в макете. Этот подход работает также и в устройствах с более низким разрешением, например, в HTC Wildfire - мои ImageButtons были правильно изменены. – StevenR