話不多說先上效果此處我是以DrawerLayout為例 當(dāng)抽屜打開的時候?qū)⒊閷细采w的位置變?yōu)槊AЧ?/p>
實現(xiàn)思路其實很簡單分為三步
1.將整個屏幕除去狀態(tài)欄截屏存為Bitmap
2.對這個Bitmap進(jìn)行高斯模糊處理
3.將處理后的圖片設(shè)置為DrawerLayout的背景或者是任何你想實現(xiàn)效果的ImageView上
中間有一些小竅門和小細(xì)節(jié)聽我娓娓到來
首先我們需要定義三個變量
//狀態(tài)欄高度
private var statusBarHeight=0
//屏幕寬度
private var screenWidth = 0
//屏幕高度
private var screenHeight = 0
接著是兩個方法 直接封裝起來了
//獲取屏幕截圖
private fun captureScreen(activity: Activity): Bitmap? {
val decorView = activity.window.decorView
//獲取狀態(tài)欄高度
val frame = Rect()
decorView.getWindowVisibleDisplayFrame(frame)
statusBarHeight = frame.top
//將截圖保存為Bitmap
val bitmap = Bitmap.createBitmap(decorView.width, decorView.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas()
canvas.setBitmap(bitmap)
decorView.draw(canvas)
screenWidth = bitmap.width
screenHeight = bitmap.height
//將截圖保存為Bitmap 保存截圖時去除頂部狀態(tài)欄
var mBitMap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, screenWidth, screenHeight - statusBarHeight)
//此處將原圖縮小為1/4(圖片會變模糊) 以提升模糊的速度 適當(dāng)配合模糊半徑達(dá)到效果
mBitMap = Bitmap.createScaledBitmap(mBitMap, screenWidth / 4, screenHeight / 4, false)
return mBitMap
}
//圖片和模糊半徑
private fun blur(bitmap: Bitmap,radius:Float): Bitmap? {
//使用RenderScript對圖片進(jìn)行高斯模糊處理
val output = Bitmap.createBitmap(bitmap) // 創(chuàng)建輸出圖片
val rs: RenderScript = RenderScript.create(this) // 構(gòu)建一個RenderScript對象
val gaussianBlue: ScriptIntrinsicBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)) //
// 創(chuàng)建高斯模糊腳本
val allIn: Allocation = Allocation.createFromBitmap(rs, bitmap) // 開辟輸入內(nèi)存
val allOut: Allocation = Allocation.createFromBitmap(rs, output) // 開辟輸出內(nèi)存
gaussianBlue.setRadius(radius) // 設(shè)置模糊半徑,范圍0f<radius<=25f
gaussianBlue.setInput(allIn) // 設(shè)置輸入內(nèi)存
gaussianBlue.forEach(allOut) // 模糊編碼,并將內(nèi)存填入輸出內(nèi)存
allOut.copyTo(output) // 將輸出內(nèi)存編碼為Bitmap审孽,圖片大小必須注意
rs.destroy()
return output
}
最后就是調(diào)用方法了
//調(diào)用獲取屏幕截圖
var bp: Bitmap? = captureScreen(this)
//對屏幕截圖進(jìn)行模糊化處理radius為模糊半徑 值越大越模糊
bp = blur(bp!!,20f) //對屏幕截圖模糊處理
//恢復(fù)模糊后的圖片為屏幕大小 此處減去了狀態(tài)欄高度
bp = Bitmap.createScaledBitmap(bp!!, screenWidth, screenHeight-statusBarHeight, false)
//將模糊后的圖片設(shè)置到想要的位置做背景
下面就是小竅門和小細(xì)節(jié)了
1.小竅門
其實已經(jīng)寫在備注里了就是將截圖保存為Bitmap后將其縮小為原來的1/4或者其他數(shù)值( 太小會變成馬賽克算是另外一種效果吧)這樣可以加快高斯模糊的速度
2.小細(xì)節(jié)
因為截圖是全屏的所以當(dāng)你局部需要使用的時候需要給ImageView設(shè)置scaleType屬性比如我這邊是從左側(cè)彈出抽屜要將其值設(shè)置為matrix,具體scaleType的屬性效果可以看我另外一篇文章
Android ImageView的scaleType屬性介紹
此外筆者很多思路和靈感(拷貝代碼)來自此篇文章
安卓AlertDialog對話框背景模糊的簡單實現(xiàn)