是否有任何代码可以在不裁剪和放大android的情况下设置壁纸?

Posted

技术标签:

【中文标题】是否有任何代码可以在不裁剪和放大android的情况下设置壁纸?【英文标题】:Is there any code to set wallpaper without cropping and zooming in android? 【发布时间】:2012-12-06 09:17:13 【问题描述】:

我正在创建一个图库应用,我的第一个应用,这是我的代码

    Bitmap bmd = BitmapFactory.decodeStream(is);

    try
        getApplicationContext().setWallpaper(bmd);
    catch(IOException e)
        e.printStackTrace();
    

上面的代码设置了墙纸,但是设置后墙纸会被裁剪或缩放! 我可以在上面的代码中做任何修改,以便我可以在设置壁纸时设置不缩放或裁剪!!!!

请帮帮我!!在此先感谢:-)

【问题讨论】:

您想设置位图大小等于设备显示屏的大小,还是想实现视差效果? 【参考方案1】:

我迟到了。希望它对您和访问您的问题的人有所帮助:

在您的情况下,尝试通过以下方式将图片调整为设备大小:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels << 1; // best wallpaper width is twice screen width

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap decodedSampleBitmap = BitmapFactory.decodeFile(path, options);

WallpaperManager wm = WallpaperManager.getInstance(this);
try 
    wm.setBitmap(decodedSampleBitmap);
 catch (IOException e) 
    Log.e(TAG, "Cannot set image as wallpaper", e);

如果上面的代码不起作用,做一个小修改:

...
WallpaperManager wm = WallpaperManager.getInstance(this);
try 
    wm.setBitmap(decodedSampleBitmap);
    wm.suggestDesiredDimensions(width, height);
 catch (IOException e) 
    Log.e(TAG, "Cannot set image as wallpaper", e);

还有calculateInSampleSize的方法:

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

    if (height > reqHeight || width > reqWidth) 

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) 
            inSampleSize *= 2;
        
    

    return inSampleSize;

记得添加权限:

<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>

【讨论】:

什么是calculateInSampleSize方法。请解释一下。 不起作用,它是按高度裁剪的。但是如何通过全幅位图设置壁纸呢?【参考方案2】:

最简单的方法是将您的壁纸图片扩展为 nn 个正方形,将您的内容放在新图片的中心。 如果你的设备是 w1024h600,你的壁纸应该是 10241024。 如果你的设备是 w600h1024,那么你的壁纸也应该是 1024*1024。

【讨论】:

以上是关于是否有任何代码可以在不裁剪和放大android的情况下设置壁纸?的主要内容,如果未能解决你的问题,请参考以下文章

在不影响纵横比的情况下裁剪图像

在android中对图像进行手绘裁剪

Android 图像选择器和裁剪器

是否可以在不构建任何应用程序的情况下向 Android 发送推送通知?

Android自动裁剪相机捕获的图像

是否可以在不做任何更改的情况下在 Android 手机中运行 JavaFX 桌面应用程序? [复制]