2013-05-21 1 views
2

J'ai un problème simple avec wallpapermanager et je ne trouve pas la réponse sur ce site. J'ai ce code très simple avec une image qui est 1280x800 (l'affichage de ma tablette). Quand je cours le code, je ne fais que mettre le centre de l'image en fond d'écran, comme si toute l'image était agrandie. Pourquoi? Merci!mise en fond d'écran de la ressource

package com.daniel.wallpaperPorsche; 

import java.io.IOException; 
import com.daniel.wallpaper.R; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.WallpaperManager; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

WallpaperManager myWallpaperManager = WallpaperManager.getInstance(this); 

try { 
    myWallpaperManager.setResource(R.drawable.porsche_911_1280x800_72dpi); 

    Toast.makeText(getBaseContext(), "Success set as wallpaper", Toast.LENGTH_SHORT).show(); 

} catch (IOException e) { 
    Toast.makeText(getBaseContext(), "Error set as wallpaper", Toast.LENGTH_SHORT).show(); 

    } 
    super.onDestroy(); 
    } 
} 

Répondre

1

La meilleure façon que j'ai trouvé pour définir le fond d'écran sans aucun problème de zoom (qui semblent souvent complètement arbitraires, comme vous le voyez lorsque les tailles de résolution sont les mêmes) est un BitmapFactory. Vous allez utiliser WallpaperManager.setBitmap au lieu de WallpaperManager.setResource. CalculateInSampleSize est une méthode que Google fournit effectivement une implémentation dans la documentation android; leur objectif est de charger de grandes bitmaps de manière efficace. Vous pouvez faire quelques lectures à ce sujet ici: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Malheureusement, leur mise en œuvre est merdique et souvent erronée. Je recommande ceci.

public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    int imageHeight = options.outHeight; 
    int imageWidth = options.outWidth; 
    int inSampleSize = 1; 

    int multiplyHeight = 1; 
    int multiplyWidth = 1; 

    while (imageHeight >= reqHeight) 
    { 
     multiplyHeight++; 
     imageHeight = imageHeight/2; 
    } 
    while (imageWidth >= reqWidth) 
    { 
     multiplyWidth++; 
     imageWidth = imageWidth/2; 
    } 

    if (multiplyHeight > multiplyWidth) 
     return multiplyHeight; 
    else 
     return multiplyWidth; 

} 

Cette méthode est plus efficace pour le chargement des fichiers volumineux, empêche un OutOfMemoryException, et devrait également éviter l'étrange que vous voyez le zoom. Si non, faites le moi savoir et je vais jeter un second regard sur ce que j'ai fait.

Questions connexes