2012-06-20 22 views
7

Ho un'app che applica lo sfondo alla schermata iniziale con immagini che corrispondono alle dimensioni dello schermo, tuttavia sulla galassia s3 lo sfondo viene ingrandito quando lo applico, anche se il l'immagine utilizzata corrisponde esattamente alle dimensioni dello schermo! È un'immagine statica e non scorre nemmeno quando si passa da una pagina all'altra della schermata principale. La cosa strana è che se applico l'immagine utilizzando la galleria integrata lo sfondo viene applicato senza zoom (viene visualizzata la schermata 'ritaglio immagine' ma la regione di ritaglio corrisponde ai bordi dell'immagine)WallpaperManager ingrandisce l'immagine anche se la dimensione corrisponde allo schermo

Il codice che uso funziona bene su un'intera gamma di telefoni (nota galassia, ace 2, s2 tra gli altri) ma non su s3; Mi stavo chiedendo se c'era qualcosa che posso fare per forzare lo sfondo a riempire lo schermo correttamente? Il codice attuale che uso per applicare la carta da parati è:

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

risposta

9

EDIT: Aggiunto Y Offset fix - grazie @ Jason Goff!

Ok, quindi risulta che la larghezza minima della schermata iniziale su s3 non è 720 ma in realtà 1280! Si può scoprire la larghezza minima desiderata e l'altezza della carta da parati chiamando

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

Quindi, al fine di applicare la carta da parati per il centro dello schermo ho dovuto creare un 1280x1280 bitmap vuota al volo, poi sovrapporre mia carta da parati al centro della bitmap vuoto, ho creato una classe BitmapHelper statico con metodi per tweaking bitmap, ecco i metodi per creare le bitmap e sovrapponendo l'immagine di sfondo:

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

e heres il resto del mio codice usando il mio 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(); 

     } 
    }); 

} 
+0

ah risolto il mio problema di come risolvere le dimensioni dell'immagine da tante ore ... – boltsfrombluesky

+1

Grazie @AndroidNoob tonnellata - stava lottando per un po 'per impostare lo sfondo esatto - finalmente con piccole modifiche al tuo codice. Fondamentalmente ho dovuto impostare un offset Y. – KurtCobain

+0

Sei il mio LIFE-SAVER! Sono rimasto bloccato a questo per mezza giornata. Grazie mille :) – Ralphilius

-1

si può provare a utilizzare suggestDesiredDimensions() metodo

+2

Per http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions%28int,%20int%29, questo metodo deve essere utilizzato solo dalle app di avvio. – gdw2

2

Si consiglia di dare un'occhiata a questo nuovo: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

dal riferimento sviluppatore:

suggestDesiredDimensions public void (int MinimumWidth, int minimumHeight)

Da: Livello API 01 Per l'utilizzo solo dall'applicazione domestica corrente, a specificare la dimensione dello sfondo che si desidera utilizzare. Ciò consente a tali applicazioni di avere uno sfondo virtuale più grande dello schermo fisico , corrispondente alla dimensione del proprio spazio di lavoro.

Nota sviluppatori, che non sembrano leggere questo. Questo è per la casa schermate per dire quale carta da parati dimensioni vorrebbero. Nessun altro dovrebbe chiamarlo! Certamente non altre app non-home che cambiano lo sfondo. Queste app dovrebbero recuperare la dimensione suggerita di in modo che possano costruire uno sfondo che lo abbini.

3

Grazie per l'articolo. Ho trovato che i miei sfondi si erano inceppati nella parte superiore dello schermo del mio dispositivo, quindi ho modificato leggermente il metodo overlayIntoCentre, sostituendo lo 0 nella seconda chiamata drawBitmap per il calcolo dell'altezza di seguito.

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; 

}

+0

Buon posto! Il mio codice presupponeva che l'altezza della bitmap di sovrapposizione fosse corretta per il dispositivo e quindi non necessitasse di centraggio verticale – AndroidNoob

+0

@Jason Goff - Sì - ha fatto esattamente la stessa cosa individuando cosa non andava - quindi controllato anche il tuo commento. Funziona bene dopo la correzione dell'offset Y. – KurtCobain