因为做项目的时候有人跟我提了一个想法,把备忘录生成一个图片,方便用户设置为壁纸,省去截屏裁剪的步骤。之前也没做过这个功能,在网络上搜索了一下,发现了一篇文章刚好满足需求地址,基本照搬上面的代码,在这基础上加上设置壁纸的功能,这样功能就基本实现了。
废话不多说,看代码
获取Activity的屏幕截图
这一步是整个环节的基础,没截图一切都是扯淡。截图部分利用的原理是通过Activity里的顶层View,再将该View的视图转化为Bitmap
public Bitmap myShot(Activity activity) {
// 获取windows中最顶层的view
View view = activity.getWindow().getDecorView();
view.builDrawingCache();
// 获取状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
Display display = activity.getWindowManager().getDefaultDisplay();
// 获取屏幕宽和高
int widths = display.getWidth();
int heights = display.getHeight();
// 允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
// 去掉状态栏
Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeights, widths, heights - statusBarHeights);
// 销毁缓存信息
view.destroyDrawingCache();
return bmp;
}
注释写的很详细了,获取DecorView,这个在自定义View的时候也了解过,是Activity的顶层View,包括title和content。然后利用View缓存的bitmap生成我们想要的bitmap,区域可以任意选择,需要截哪部分自行修改参数即可。
设置壁纸
获取到bitmap了,接下来看如何设置壁纸。设置壁纸需要用到的类是WallPaperManager,跟大多数的服务一样,需要context来获取,提醒:要在Manifest文件里给<uses-permission android:name="android.permission.SET_WALLPAPER" />
public void setWallPaper(Bitmap bitmap, Activity activity) {
WallPaperManager manager = WallPaperManager.getInstance(activity);
manager.setBitmap(bitmap);
}
只有几行代码就搞定了,是不是觉得特别简单。
但是运行程序后你就会发现,效果不对,这是因为因为截取的部分较小,在设置时系统会以居中显示的方式设置壁纸。所以后来我的想法是自己进行bitmap的放大后再裁剪,确保最终的bitmap大小与屏幕大小一致。
网友评论