是否有任何代码可以在不裁剪和放大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的情况下设置壁纸?的主要内容,如果未能解决你的问题,请参考以下文章