WallpaperManager amplía la imagen aunque la dimensión coincida con la pantalla

Tengo una aplicación que aplica fondo de pantalla a la pantalla de inicio con imágenes que coinciden con el tamaño de la pantalla, sin embargo en la galaxia s3 el fondo de pantalla se amplía cuando lo aplico, a pesar de que la imagen utilizada coincide exactamente con las dimensiones de la pantalla! Es una imagen estática y ni siquiera se desplaza cuando cambia entre páginas en la pantalla de inicio. Lo extraño es que si aplico la imagen usando la galería incorporada, el fondo de pantalla se aplica bien sin el zoom (aparece con la pantalla de 'imagen de cultivo' pero la propia región de cultivo coincide con los bordes de la imagen)

El código que uso funciona bien en toda una serie de teléfonos (nota de galaxia, as 2, s2 entre otros) pero no en el s3; Me preguntaba si había algo que puedo hacer para forzar el fondo de pantalla para llenar la pantalla correctamente? El código actual que utilizo para aplicar el fondo de pantalla es:

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); wallpaperManager.setWallpaperOffsets(wallpaperViewer.getApplicationWindowToken(), 0, 0); wallpaperManager.setBitmap(BitmapFactory.decodeFile(file.getPath()));//file is jpg on sd card 

EDIT : Añadido corrección offset Y – gracias @ Jason Goff!

Ok, así que resulta que el ancho mínimo de la pantalla de inicio en el s3 no es 720, pero en realidad 1280! Puede averiguar el ancho mínimo deseado y la altura del fondo de pantalla llamando al

 wallpaperManager.getDesiredMinimumWidth();//returned 1280 on s3 wallpaperManager.getDesiredMinimumHeight();//also returned 1280 on s3 

Así que para aplicar el fondo de pantalla al centro de la pantalla tuve que crear un mapa de bits en blanco 1280×1280 sobre la marcha, luego superponer mi fondo de pantalla en el centro del mapa de bits en blanco, he creado una clase BitmapHelper estática con métodos para ajustar mapas de bits, Los métodos para crear los mapas de bits y superponer la imagen de fondo de pantalla:

 public class BitmapHelper { public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) { Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap //overlay the second in the centre of the first //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!) //EDIT: added Y offest fix - thanks @Jason Goff! canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null); return bmOverlay; } public static Bitmap createNewBitmap(int width, int height) { //create a blanks bitmap of the desired width/height return Bitmap.createBitmap(width, height, Config.ARGB_8888); } } 

Y heres el resto de mi código usando mi BitmapHelper:

 private void applyWallpaperFromFile(final File file) { Bitmap wallpaperImage = BitmapFactory.decodeFile(file.getPath()); try { if((wallpaperManager.getDesiredMinimumWidth()>0)&&(wallpaperManager.getDesiredMinimumHeight()>0)) { Bitmap blank = BitmapHelper.createNewBitmap(wallpaperManager.getDesiredMinimumWidth(), wallpaperManager.getDesiredMinimumHeight()); Bitmap overlay = BitmapHelper.overlayIntoCentre(blank, wallpaperImage); wallpaperManager.setBitmap(overlay); } else { wallpaperManager.setBitmap(wallpaperImage); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(WallpaperActivity.this,"Wallpaper set to:"+file.getName(), Toast.LENGTH_SHORT).show(); } }); } 

Gracias por el artículo. Descubrí que mis fondos de pantalla se estaban atascando en la parte superior de la pantalla de mi dispositivo, por lo que cambié el método overlayIntoCentre ligeramente, sustituyendo el 0 en la segunda llamada drawBitmap para el cálculo de altura a continuación.

 public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) { Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap //overlay the second in the centre of the first //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!) canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null); return bmOverlay; 

}

Es posible que desee echar un vistazo a esto de nuevo: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

Desde la referencia del desarrollador:

Public void suggestDesiredDimensions (int minimumWidth, int minimumHeight)

Desde: API Nivel 5 Para usar sólo por la aplicación principal actual, para especificar el tamaño del fondo de pantalla que desea utilizar. Esto permite que estas aplicaciones tengan un fondo de pantalla virtual que es más grande que la pantalla física, que coincide con el tamaño de su espacio de trabajo.

Nota desarrolladores, que no parecen estar leyendo esto. Esto es para pantallas de inicio para decir qué tamaño de papel de fondo que les gustaría. ¡Nadie debería llamar a esto! Ciertamente no otras aplicaciones que no sean de pantalla de inicio que cambian el fondo de pantalla. Esas aplicaciones se supone que recuperar el tamaño sugerido para que puedan construir un fondo de pantalla que coincide con él.

Puede intentar usar el método suggestDesiredDimensions ()

  • Activar la pantalla en el dispositivo
  • Intercambio de pantalla de Android mediante programación (Root)
  • ¿La mejor manera de tener una pantalla de bienvenida en una aplicación de Android?
  • Androide ¿Cómo estirar las filas en el gridview para llenar la pantalla?
  • La mayoría de los tamaños de pantalla populares / resoluciones en los teléfonos Android
  • Android: Manejo eficiente de la rotación de la pantalla
  • Cómo obtener el tamaño total de la pantalla en un dispositivo android programaticamente
  • Android y el soporte de múltiples diseños de pantallas
  • ¿Cómo puedo escribir mediante programación un acceso directo a una página específica en la pantalla de inicio del lanzador de Android?
  • Ir a la pantalla de inicio programáticamente
  • Los identificadores notlong / long del recurso del androide no trabajan
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.