即使尺寸与屏幕匹配,WallpaperManager也会缩放图像

时间:2012-06-20 12:52:31

标签: android wallpaper homescreen

我有一个应用程序,将壁纸应用于主屏幕,其图像与屏幕尺寸相匹配,但是在星系s3上,壁纸在我应用时会放大,即使使用的图像与屏幕尺寸完全匹配!它是静态图像,在主屏幕上切换页面时甚至不滚动。奇怪的是,如果我使用内置图库应用图像,壁纸可以在没有缩放的情况下正常应用(它会显示“裁剪图像”屏幕,但裁剪区域本身与图像的边缘匹配)

我使用的代码在整个手机阵列上工作正常(星系注释,ace 2,s2等)但不在s3上;我想知道是否有什么可以强迫壁纸正确填满屏幕?我用来应用壁纸的当前代码是:

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

4 个答案:

答案 0 :(得分:9)

编辑:添加了Y偏移修复 - 感谢@Jason Goff!

好吧事实证明,s3主屏幕的最小宽度不是720,而是1280!您可以通过调用

找到所需的最小壁纸宽度和高度
wallpaperManager.getDesiredMinimumWidth();//returned 1280 on s3
wallpaperManager.getDesiredMinimumHeight();//also returned 1280 on s3

因此,为了将壁纸应用到屏幕中心,我必须动态创建一个空白位图1280x1280,然后将我的壁纸覆盖到空白位图的中心,我创建了一个静态BitmapHelper类,其中包含调整方法位图,这是创建位图和覆盖壁纸图像的方法:

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

并使用我的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();

        }
    });

}

答案 1 :(得分:3)

感谢您的文章。我发现我的壁纸卡在设备屏幕的顶部,所以我稍微更改了overlayIntoCentre方法,用第二个drawBitmap调用中的0代替下面的高度计算。

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;

}

答案 2 :(得分:2)

您可能希望再次查看此内容:http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

来自开发人员参考:

  

public void suggestDesiredDimensions(int minimumWidth,int minimumHeight)

     

自:API等级5   仅供当前的家庭应用程序使用   指定它想要使用的壁纸的大小。这允许这样的   应用程序有一个大于的虚拟壁纸   物理屏幕,匹配其工作空间的大小。

     

注意开发人员,他们似乎没有阅读此内容。这是为了家   屏幕,告诉他们想要什么尺寸的壁纸。没有其他人   应该叫这个!当然不是其他非主屏应用程序   改变壁纸。那些应用程序应该检索   建议大小,以便他们可以构建匹配它的壁纸。

答案 3 :(得分:-1)

您可以尝试使用suggestDesiredDimensions()方法