话不多说先上效果此处我是以DrawerLayout为例 当抽屉打开的时候将抽屉覆盖的位置变为毛玻璃效果
将虚化后的背景设置到Drawer上
实现思路其实很简单分为三步
1.将整个屏幕除去状态栏截屏存为Bitmap
2.对这个Bitmap进行高斯模糊处理
3.将处理后的图片设置为DrawerLayout的背景或者是任何你想实现效果的ImageView上
中间有一些小窍门和小细节听我娓娓到来
首先我们需要定义三个变量
//状态栏高度
private var statusBarHeight=0
//屏幕宽度
private var screenWidth = 0
//屏幕高度
private var screenHeight = 0
接着是两个方法 直接封装起来了
//获取屏幕截图
private fun captureScreen(activity: Activity): Bitmap? {
val decorView = activity.window.decorView
//获取状态栏高度
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 保存截图时去除顶部状态栏
var mBitMap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, screenWidth, screenHeight - statusBarHeight)
//此处将原图缩小为1/4(图片会变模糊) 以提升模糊的速度 适当配合模糊半径达到效果
mBitMap = Bitmap.createScaledBitmap(mBitMap, screenWidth / 4, screenHeight / 4, false)
return mBitMap
}
//图片和模糊半径
private fun blur(bitmap: Bitmap,radius:Float): Bitmap? {
//使用RenderScript对图片进行高斯模糊处理
val output = Bitmap.createBitmap(bitmap) // 创建输出图片
val rs: RenderScript = RenderScript.create(this) // 构建一个RenderScript对象
val gaussianBlue: ScriptIntrinsicBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)) //
// 创建高斯模糊脚本
val allIn: Allocation = Allocation.createFromBitmap(rs, bitmap) // 开辟输入内存
val allOut: Allocation = Allocation.createFromBitmap(rs, output) // 开辟输出内存
gaussianBlue.setRadius(radius) // 设置模糊半径,范围0f<radius<=25f
gaussianBlue.setInput(allIn) // 设置输入内存
gaussianBlue.forEach(allOut) // 模糊编码,并将内存填入输出内存
allOut.copyTo(output) // 将输出内存编码为Bitmap,图片大小必须注意
rs.destroy()
return output
}
最后就是调用方法了
//调用获取屏幕截图
var bp: Bitmap? = captureScreen(this)
//对屏幕截图进行模糊化处理radius为模糊半径 值越大越模糊
bp = blur(bp!!,20f) //对屏幕截图模糊处理
//恢复模糊后的图片为屏幕大小 此处减去了状态栏高度
bp = Bitmap.createScaledBitmap(bp!!, screenWidth, screenHeight-statusBarHeight, false)
//将模糊后的图片设置到想要的位置做背景
下面就是小窍门和小细节了
1.小窍门
其实已经写在备注里了就是将截图保存为Bitmap后将其缩小为原来的1/4或者其他数值( 太小会变成马赛克算是另外一种效果吧)这样可以加快高斯模糊的速度
2.小细节
因为截图是全屏的所以当你局部需要使用的时候需要给ImageView设置scaleType属性比如我这边是从左侧弹出抽屉要将其值设置为matrix,具体scaleType的属性效果可以看我另外一篇文章
Android ImageView的scaleType属性介绍
此外笔者很多思路和灵感(拷贝代码)来自此篇文章
安卓AlertDialog对话框背景模糊的简单实现
网友评论