Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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

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