Как использовать различные фоновые изображения для разных разрешений в 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"/>
Update:
Код моей активности:
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, я несколько раз читал официальную документацию:
и некоторые связанные вопросы:
Обновить: фиксированные опечатки в именах папок.
Ответы
Ответ 1
Если вы хотите настроить таргетинг на конкретное устройство. или всех устройств, которые находятся между двумя разрешениями, вам сначала нужно найти ширину устройства. как это
Display display ;
int width =0;
display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
после этого вы можете сделать, если инструкции с условиями ширины и сделать разные макеты для разных размеров экранов. этот метод не рекомендуется, но отлично работает в некотором случае
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);
}
Надеюсь, это поможет вам.
Ответ 2
вы правы, он выберет ресурс из w800dp
, потому что вы работаете в портретном режиме.
Системное соответствующее значение ширины изменяется, когда ориентация экрана переключается между пейзажем и портретом, чтобы отразить текущую фактическую ширину, доступную для вашего пользовательского интерфейса.
использовать res/drawable-sw600dp
наименьшая ширина устройства не изменяется при изменении ориентации экрана.