Android 复习学习使用Android

Android Activity背景截图并模糊处理

2021-07-09  本文已影响0人  神户西瓜

话不多说先上效果此处我是以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对话框背景模糊的简单实现

感谢观看
上一篇下一篇

猜你喜欢

热点阅读