因?yàn)樽鲰?xiàng)目的時(shí)候有人跟我提了一個(gè)想法,把備忘錄生成一個(gè)圖片,方便用戶設(shè)置為壁紙,省去截屏裁剪的步驟。之前也沒做過這個(gè)功能,在網(wǎng)絡(luò)上搜索了一下,發(fā)現(xiàn)了一篇文章剛好滿足需求地址,基本照搬上面的代碼,在這基礎(chǔ)上加上設(shè)置壁紙的功能,這樣功能就基本實(shí)現(xiàn)了。
廢話不多說,看代碼
獲取Activity的屏幕截圖
這一步是整個(gè)環(huán)節(jié)的基礎(chǔ),沒截圖一切都是扯淡。截圖部分利用的原理是通過Activity里的頂層View,再將該View的視圖轉(zhuǎn)化為Bitmap
public Bitmap myShot(Activity activity) {
// 獲取windows中最頂層的view
View view = activity.getWindow().getDecorView();
view.builDrawingCache();
// 獲取狀態(tài)欄高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
Display display = activity.getWindowManager().getDefaultDisplay();
// 獲取屏幕寬和高
int widths = display.getWidth();
int heights = display.getHeight();
// 允許當(dāng)前窗口保存緩存信息
view.setDrawingCacheEnabled(true);
// 去掉狀態(tài)欄
Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeights, widths, heights - statusBarHeights);
// 銷毀緩存信息
view.destroyDrawingCache();
return bmp;
}
注釋寫的很詳細(xì)了,獲取DecorView,這個(gè)在自定義View的時(shí)候也了解過,是Activity的頂層View,包括title和content。然后利用View緩存的bitmap生成我們想要的bitmap,區(qū)域可以任意選擇,需要截哪部分自行修改參數(shù)即可。
設(shè)置壁紙
獲取到bitmap了,接下來看如何設(shè)置壁紙。設(shè)置壁紙需要用到的類是WallPaperManager,跟大多數(shù)的服務(wù)一樣,需要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);
}
只有幾行代碼就搞定了,是不是覺得特別簡單。
但是運(yùn)行程序后你就會發(fā)現(xiàn),效果不對,這是因?yàn)橐驗(yàn)榻厝〉牟糠州^小,在設(shè)置時(shí)系統(tǒng)會以居中顯示的方式設(shè)置壁紙。所以后來我的想法是自己進(jìn)行bitmap的放大后再裁剪,確保最終的bitmap大小與屏幕大小一致。