Android獲取當(dāng)前Activity的屏幕截圖并設(shè)置為壁紙

因?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大小與屏幕大小一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容