Как использовать разные фоновые изображения для разных разрешений в 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, несколько раз прочитал официальную документацию:

и некоторые связанные вопросы:

Обновление: исправлены опечатки в именах папок.

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

Наименьшая ширина устройства не изменяется при изменении ориентации экрана.

Другие вопросы по тегам