2012-06-20 8 views
7

Mam aplikację, która stosuje tapetę do ekranu głównego z obrazami pasującymi do rozmiaru ekranu, jednak w galaktyce s3 tapeta jest powiększana, gdy ją stosuję, mimo że użyte zdjęcie dokładnie pasuje do wymiarów ekranu! Jest to obraz statyczny i nie przewija nawet po przełączeniu między stronami na ekranie głównym. Dziwne jest to, że jeśli zastosuję obraz za pomocą wbudowanej galerii, tapeta zostanie zastosowana bez powiększenia (pojawi się ekran "przycinanie obrazu", ale sam obszar przycięcia będzie pasował do krawędzi obrazu)WallpaperManager powiększa obraz, nawet jeśli wymiar pasuje do ekranu

Kod, którego używam działa dobrze na całej gamie telefonów (między innymi galaxy note, as 2, s2), ale nie na s3; Zastanawiałem się, czy jest coś, co mogę zrobić, aby zmusić tapetę do właściwego wypełnienia ekranu? Obecny kod używam zastosować tapetę jest:

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

Odpowiedz

9

EDIT: Dodane Y przesunięcie fix - Dzięki @Jason Goff!

OK, więc okazuje się, że minimalna szerokość ekranu głównego na s3 to nie 720, ale w rzeczywistości 1280! Możesz dowiedzieć się pożądany minimalną szerokość i wysokość tapety wywołując

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

Więc w celu zastosowania tapety na środku ekranu musiałem utworzyć pusty bitmapy 1280x1280 w locie, a następnie nałożyć moje tapety w środku pustą bitmapę, stworzyłem statyczną klasę BitmapHelper z metod szczypanie bitmap, oto metody tworzenia map bitowych i nakładanie obrazu tapeta:

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

i Herezje resztę mojego kodu za pomocą mojego 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 rozwiązać mój problem, jak naprawić rozmiaru obrazu od tylu godzin ... – boltsfrombluesky

+1

Thanks a @AndroidNoob ton - zmagała się przez chwilę, aby ustawić dokładny tapety - w końcu to z drobne poprawki do twojego kodu. Zasadniczo musiał ustawić przesunięcie Y. – KurtCobain

+0

Jesteś moim ŻYCIEM ŻYCIA! Utknąłem w tym przez pół dnia. Dziękuję bardzo :) – Ralphilius

-1

można spróbować użyć suggestDesiredDimensions() metoda

+2

Per http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions%28int,%20int%29, ta metoda jest używana tylko przez aplikacje uruchamiające. – gdw2

2

Możesz spojrzeć na to jeszcze raz: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

Z odniesieniem autorów:

public void suggestDesiredDimensions (int minimumWidth, int minimumHeight)

Od: API Poziom 5 Do użytku wyłącznie przy bieżącym zgłoszeniu domowym, do określa rozmiar tapety, której chciałbyś użyć. Dzięki temu takie aplikacje mogą mieć wirtualną tapetę większą niż fizyczny ekran, dopasowany do rozmiaru ich obszaru roboczego.

Twórcy notatek, którzy nie czytają tego. To jest dla ekranów domowych, aby powiedzieć, jaki rozmiar tapety chcieliby. Nikt inny, nie powinien nazywać tego! Z pewnością nie inne aplikacje nie na ekranie głównym, które zmieniają tapetę. Te aplikacje mają pobrać sugerowany rozmiar , aby mogły utworzyć tapetę, która je dopasuje.

3

Dzięki za artykuł. Zauważyłem, że moje tapety zacinały się w górnej części ekranu mojego urządzenia, więc nieznacznie zmieniłem metodę nakładkiIntoCentre, zastępując 0 w drugim wywołaniu drawBitmap dla obliczenia wysokości poniżej.

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

Dobre miejsce! Mój kod zakładał, że wysokość nakładki mapy bitowej jest poprawna dla urządzenia i dlatego nie potrzebował centrowania w pionie. – AndroidNoob

+0

@Jason Goff - Tak - zrobił dokładnie to samo, ustalając, co było nie tak - następnie sprawdził również twój komentarz. Działa dobrze po rozwiązaniu Y-offset. – KurtCobain

Powiązane problemy