¿Cómo usar diferentes imágenes de fondo para diferentes resoluciones en Android?

Estoy haciendo una aplicación de Android para tabletas de Android que tiene un fondo de imagen completa, pero no puedo usar un parche de 9 , por lo que necesito el fondo para estar lo más cerca posible como el tamaño de la ventana.

Lo que he probado:

He probado con el drawable-ldpi , drawable-ldpi drawable-mdpi , etc … carpetas, pero como quiero que las imágenes se ajusten a la ventana, no funciona tan bien.

Ahora estoy intentando con el drawable-wxxxdp , carpetas para tener imágenes con tamaños que están cerca del tamaño real de la ventana.

Así que tengo esta estructura de la carpeta (cada carpeta con una imagen diferente, es decir: las imágenes del mismo tamaño son diferentes en carpetas diferentes):

 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 

El problema es que cuando pruebo la aplicación en diferentes tabletas no siempre toma la imagen de la carpeta esperada .

Por ejemplo: en una tableta de 1280x800px y 160 dpis , que informa (usando DisplayMetrics ) un tamaño de ventana de 1280×752 , utiliza la imagen 1280x800px de la carpeta drawable-w1280dp-mdpi y corta un poco la imagen de arriba a abajo. Pero en una tableta de 1280x800px y 213dpis que reporta un tamaño de ventana de 1280×736 toma la imagen de la drawable-w800dp-hdpi … Esperaría tomarla de otra carpeta como una de las carpetas dibujables-w1024dp … pero no De ese uno …

Por otro lado si intento el emulador con una configuración como 1024x600px y 160dpis que reporta un tamaño de ventana de 1024×552 obtiene la imagen de la carpeta drawable-w1024dp-hdpi pero la reduce y la centra en la pantalla para terminar Con el borde muy grande alrededor de la imagen .

Archivos:

El diseño de pruebas que estoy usando es:

 <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> 

Y en mi archivo de manifiesto tengo:

 <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"/> 

Actualización: Mi código de actividad:

 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; } } 

Resumen:

Así que no sé cómo predecir desde qué carpeta es la aplicación va a tomar la imagen? Y lo que va a hacer con ella? (Escala, cultivo …)

Antecedentes adicionales:

He comprobado todas las preguntas en la etiqueta android-resoruces , he leído varias veces la documentación oficial:

  • Soportando varias pantallas
  • Proporcionar recursos: Mejor coincidencia

Y algunas preguntas relacionadas:

  • Cómo encontrar el mejor partido
  • Recursos de Android "mejor coincidencia" lógica de fallback
  • Mapa de bits dinámico dibujable en android
  • ¿Por qué Android utiliza recursos del recurso superior en lugar de un menor?

Actualización: corrigió los errores tipográficos en los nombres de carpeta.

Si desea asignar un dispositivo específico. O todos los dispositivos que están entre dos resoluciones, entonces usted tiene que encontrar el ancho del dispositivo en primer lugar. Me gusta esto

 Display display ; int width =0; display = getWindowManager().getDefaultDisplay(); width = display.getWidth(); 

Después de que usted puede hacer declaraciones con condiciones de ancho y hacer diferentes diseños para diferentes tamaños de pantalla. Este método no es recomendable, pero funciona muy bien en algunos casos

  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); } 

Espero que esto te ayudará.

Usted está en lo correcto recogerá recursos de w800dp , porque está ejecutando en modo retrato.

El valor correspondiente al ancho del sistema cambia cuando la orientación de la pantalla cambia entre horizontal y vertical para reflejar el ancho real actual disponible para la interfaz de usuario.

res/drawable-sw600dp

El smallestWidth del dispositivo no cambia cuando la orientación de la pantalla cambia.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.