2012-06-20 6 views
7

Ich habe eine App, die Hintergrundbild auf dem Startbildschirm mit Bildern, die die Bildschirmgröße entsprechen, aber auf der Galaxie s3 das Hintergrundbild ist herangezoomt, wenn ich es anwende, obwohl die Bild verwendet genau die Bildschirmabmessungen! Es ist ein statisches Bild und scrollt nicht einmal, wenn Sie zwischen den Seiten auf dem Startbildschirm wechseln. Das seltsame Ding ist, dass, wenn ich das Bild unter Verwendung der eingebauten Galerie anwende, das Hintergrundbild gut ohne den Zoom angewandt wird (es kommt mit dem "Ausschnittbild" Bildschirm, aber der Ausschnittbereich selbst entspricht den Rändern des Bildes)WallpaperManager zoomt Bild, obwohl die Dimension dem Bildschirm

Der Code, den ich verwende funktioniert gut auf einer ganzen Reihe von Telefonen (Galaxy Note, Ass 2, s2 unter anderem), aber nicht auf der s3; Ich habe mich gefragt, ob es etwas gibt, was ich tun kann, um zu zwingen, dass die Tapete den Bildschirm richtig füllt? Der aktuelle Code i die Tapete anwenden verwenden ist:

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

Antwort

9

EDIT: Added Y-Offset fix - dank @ Jason Goff!

Ok also es stellt sich heraus, dass die minimale Breite des Startbildschirms auf der S3 nicht 720, sondern 1280! Sie können die gewünschte Mindestbreite und -höhe der Tapete durch

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

So ruft herauszufinden, um die Tapete auf die Mitte des Bildschirms anzuwenden i on the fly, dann überlagern meine Tapete eine leere Bitmap 1280x1280 erstellen hatte in die Mitte des leeren Bitmap, ich eine statische BitmapHelper Klasse mit Methoden erstellt Bitmaps für das Verhalten, hier die Methoden für die Bitmaps erstellen und die über das Hintergrundbild:

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

und heren den Rest meines Code meines BitmapHelper mit :

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 mein Problem gelöst, wie von so viele Stunden der Bildgröße zu beheben ... – boltsfrombluesky

+1

Dank einer Tonne @AndroidNoob - kämpfen wurde für eine Weile des genauen Hintergrund einstellen - es endlich mit kleinere Änderungen an Ihrem Code. Grundsätzlich musste ein Y-Offset eingestellt werden. – KurtCobain

+0

Du bist mein LEBENSRETTER! Ich habe einen halben Tag lang daran festgehalten. Vielen Dank :) – Ralphilius

-1

können Sie versuchen, suggestDesiredDimensions() -Methode

+2

Pro http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions%28int,%20int%29, diese Methode wird nur von Launcher-Apps verwendet. – gdw2

2

Sie möchten vielleicht einen Blick auf diese wieder mit: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

Von der Entwickler-Referenz:

public void suggestDesiredDimensions (int Minimum, int minimumHeight)

Seit: API Level 5 Nur für die aktuelle Home-Anwendung, zu Geben Sie die Größe des Hintergrunds an, den Sie verwenden möchten. Dadurch können solche Anwendungen einen virtuellen Hintergrund haben, der größer ist als der physische Bildschirm und der Größe ihres Arbeitsbereichs entspricht.

Hinweis Entwickler, die dies nicht zu lesen scheinen. Dies ist für zu Hause Bildschirme zu sagen, welche Größe Tapete sie möchten. Niemand sonst sollte dies nennen! Sicherlich nicht andere Nicht-Home-Bildschirm-Apps, die das Hintergrundbild ändern. Diese Apps sollen die vorgeschlagene Größe abrufen, damit sie ein entsprechendes Hintergrundbild erstellen können.

3

Danke für den Artikel. Ich habe festgestellt, dass meine Hintergrundbilder in den oberen Bereich meines Gerätebildschirms geraten sind. Daher habe ich die overlayIntoCentre-Methode leicht geändert und die 0 im zweiten Aufruf für die Höhenberechnung durch 0 ersetzt.

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

Guter Ort! Mein Code ging davon aus, dass die Höhe der überlagerten Bitmap für das Gerät korrekt war und daher keine vertikale Zentrierung erforderlich war. – AndroidNoob

+0

@Jason Goff - Ja - genau das Gleiche, indem Sie herausgefunden haben, was falsch war - dann haben Sie auch Ihren Kommentar überprüft. Funktioniert gut nach dem Y-Offset-Fix. – KurtCobain

Verwandte Themen