美文网首页Android 复习学习使用Android
Android Activity背景截图并模糊处理

Android Activity背景截图并模糊处理

作者: 神户西瓜 | 来源:发表于2021-07-09 17:24 被阅读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对话框背景模糊的简单实现

    感谢观看

    相关文章

      网友评论

        本文标题:Android Activity背景截图并模糊处理

        本文链接:https://www.haomeiwen.com/subject/ofwfpltx.html