Как использовать разные фоновые изображения для разных разрешений в Android?
Я делаю приложение для Android для планшетов Android, у которого фоновый рисунок полностью, но я не могу использовать 9-патч, поэтому мне нужно, чтобы фон был как можно ближе к размеру окна.
Что я проверил:
Я проверил, используя drawable-ldpi
, drawable-mdpi
и т. д... папки, но так как я хочу, чтобы изображения помещались в окно, это не так хорошо работает.
Сейчас я пытаюсь с drawable-wxxxdp
папки для изображений с размерами, близкими к реальному размеру окна.
Таким образом, у меня есть эта структура папок (каждая папка с различным изображением, то есть: изображения одного размера различны в разных папках):
drawable-w800dp-mdpi // 800x600px image
drawable-w800dp-hdpi // 800x600px image
drawable-w1024dp-mdpi // 1024x600px image
drawable-w1024dp-hdpi // 1024x600px image
drawable-w1280dp-mdpi // 1280x800 image
drawable-w1280dp-hdpi // 1280x800 image
drawable-w1280dp-xhdpi // 1280x800 image
Проблема в том, что когда я тестирую приложение на разных планшетах, оно не всегда берет изображение из ожидаемой папки.
Например: в планшете 1280x800px и 160 dpis, который сообщает (используя DisplayMetrics
) размер окна 1280x752, он использует изображение 1280x800px из drawable-w1280dp-mdpi
папка и немного обрезает изображение сверху и снизу. Но на планшете 1280x800px и 213dpis, который сообщает о размере окна 1280x736, он берет изображение с drawable-w800dp-hdpi
... Я хотел бы взять его из другой папки, например, из папки drawable-w1024dp... но не из этой...
С другой стороны, если я попытаюсь использовать эмулятор с конфигурацией, такой как 1024x600px и 160dpis, которая сообщает о размере окна 1024x552, он получает изображение из drawable-w1024dp-hdpi
папку, но она уменьшает его и центрирует его на экране, поэтому я заканчиваю с очень большой рамкой вокруг изображения.
файлы:
Макет тестирования, который я использую:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/appBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
android:src="@drawable/background_image"
tools:ignore="ContentDescription" />
</RelativeLayout>
и в моем файле манифеста у меня есть:
<uses-sdk
android:minSdkVersion="13"
android:targetSdkVersion="15" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"/>
Обновление: мой код активности:
public class ScreenTest extends Activity {
private int width;
private int height;
private int dpis;
private String sdpis;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Ask for a full screen window
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_screen_test);
}
/* (non-Javadoc)
* @see android.app.Activity#onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet)
*/
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
return super.onCreateView(name, context, attrs);
}
/* (non-Javadoc)
* @see android.app.Activity#onStart()
*/
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// Get the info about the screen
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth();// size.x;
height = display.getHeight();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
dpis = outMetrics.densityDpi;
sdpis = "";
switch (dpis) {
case DisplayMetrics.DENSITY_DEFAULT:
sdpis = "160";
break;
case DisplayMetrics.DENSITY_HIGH:
sdpis = "240";
break;
case DisplayMetrics.DENSITY_LOW:
sdpis = "120";
break;
case DisplayMetrics.DENSITY_XHIGH:
sdpis = "320";
break;
default:
sdpis +=dpis;
break;
}
Log.d("DPIs", "dpis: " + dpis + " sdpis: " + sdpis + " width: " + width + " height: " + height);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_screen_test, menu);
return true;
}
}
Резюме:
Так что я не знаю, как предсказать, из какой папки приложение получит изображение? и что это будет с этим делать? (масштаб, обрезка...)
Дополнительный фон:
Я проверил все вопросы по тегу android-resoruces, несколько раз прочитал официальную документацию:
и некоторые связанные вопросы:
- Как узнать лучший матч
- Ресурсы Android "наилучшее совпадение" резервная логика
- Динамическое растровое изображение в Android
- Почему Android использует ресурсы более высокого ресурса вместо более низкого?
Обновление: исправлены опечатки в именах папок.
2 ответа
Если вы хотите настроить таргетинг на конкретное устройство. или все устройства, которые находятся между двумя разрешениями, тогда вы должны сначала найти ширину устройства. как это
Display display ;
int width =0;
display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
после этого вы можете делать операторы if с условиями ширины и делать разные макеты для разных размеров экрана. этот метод не рекомендуется, но в некоторых случаях он отлично работает
if(width>=750)
{
setContentView(R.layout.screen_blue_heigh);
}
else if(width>=500&&width<750)
{
setContentView(R.layout.screen_blue_heigh);
}
else if(width<500&&width>=330)
{
setContentView(R.layout.screen_blue_medium);
}
else if(width<320)
{
setContentView(R.layout.screen_blue_low);
}
Надеюсь, что это поможет вам.
Вы правы, он будет выбирать ресурс из w800dp
Потому что вы работаете в портретном режиме.
Соответствующее значение ширины системы изменяется, когда ориентация экрана переключается между альбомной и книжной ориентацией, чтобы отразить текущую фактическую ширину, доступную для вашего пользовательского интерфейса.
использование res/drawable-sw600dp
Наименьшая ширина устройства не изменяется при изменении ориентации экрана.