android dialog背景模糊化效果

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog的背景设为启动acitivity的模糊化图片.

实现思路:
1. 截屏, 获取当前activity的界面
2. 将获取的照片进行模糊化
3. 将模糊化的图片设为dialog的背景

1.截屏, 获取当前activity的界面

    private Bitmap takeScreenShot(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap b1 = view.getDrawingCache();

        // 获取屏幕长和高
        int width = activity.getResources().getDisplayMetrics().widthPixels;
        int height = activity.getResources().getDisplayMetrics().heightPixels;

        Bitmap bmp = Bitmap.createBitmap(b1, 0, 0, width, height);
        view.destroyDrawingCache();
        return bmp;
    }

这里需要注意: 默认dialog是全屏, activity也是全屏没有状态栏. 如果有状态栏需要获取状态栏大小, 在创建图片的时候减去状态栏大小.

2.将获取的图片进行模糊化, 这里的模糊算法, 是从网上查到, 具体是进行高斯模糊. 具体代码在下面的工具类中.

3.设置模糊图片为dialog的背景

//blurBackgroundDrawer为模糊后的背景图片
 Window window = getWindow();
 window.setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), blurBackgroundDrawer));

注意: 模糊化图片可能会比较慢, 刚开始测得时候在3 - 4秒之间, 解决办法是将获取到的屏幕进行缩小,然后在进行模糊, 模糊完后, 再将图片放大.

下面是将背景模糊化效果封装成的工具类代码, 使用方法: 只需要将其考到工程中, 在需要模糊化效果的地方调用:
Bitmap bmp = getBlurBackgroundDrawer(activity); 即可.

public class FastBlurUtility {

    /**
     * 获得模糊化的背景图片
     * @param activity 获取模糊化的背景activity
     * @return 模糊化的背景图片
     */
    public static Bitmap getBlurBackgroundDrawer(Activity activity) {
        Bitmap bmp = takeScreenShot(activity);
        return startBlurBackground(bmp);
    }

    /**
     * 截屏
     * @param activity 截屏的activity
     * @return 截屏图片
     */
    private static Bitmap takeScreenShot(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap b1 = view.getDrawingCache();

        // 获取屏幕长和高
        int width = activity.getResources().getDisplayMetrics().widthPixels;
        int height = activity.getResources().getDisplayMetrics().heightPixels;

        Bitmap bmp = Bitmap.createBitmap(b1, 0, 0, width, height);
        view.destroyDrawingCache();
        return bmp;
    }

    private static Bitmap startBlurBackground(Bitmap bkg) {
        long startMs = System.currentTimeMillis();
        float radius = 20; //模糊程度

        Bitmap overlay = fastblur(small(bkg), (int) radius);

        Log.i("FastBlurUtility", "=====blur time:" + (System.currentTimeMillis() - startMs));
        return big(overlay);
    }

    /**
     * 放大图片
     * @param bitmap 需要放大的图片
     * @return 放大的图片
     */
    private static Bitmap big(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        matrix.postScale(4f, 4f);
        Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        return resizeBmp;
    }

    /**
     * 缩小图片
     * @param bitmap 需要缩小的图片
     * @return 缩小的图片
     */
    private static Bitmap small(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        matrix.postScale(0.25f, 0.25f);
        Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        return resizeBmp;
    }

    /**
     * 将图片模糊化
     * @param sentBitmap 需要模糊的图片
     * @param radius     模糊程度
     * @return 模糊后的图片
     */
    private static Bitmap fastblur(Bitmap sentBitmap, int radius) {

        Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);

        if (radius < 1) {
            return (null);
        }

        int w = bitmap.getWidth();
        int h = bitmap.getHeight();

        int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);

        int wm = w - 1;
        int hm = h - 1;
        int wh = w * h;
        int div = radius + radius + 1;

        int r[] = new int[wh];
        int g[] = new int[wh];
        int b[] = new int[wh];
        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
        int vmin[] = new int[Math.max(w, h)];

        int divsum = (div + 1) >> 1;
        divsum *= divsum;
        int dv[] = new int[256 * divsum];
        for (i = 0; i < 256 * divsum; i++) {
            dv[i] = (i / divsum);
        }

        yw = yi = 0;

        int[][] stack = new int[div][3];
        int stackpointer;
        int stackstart;
        int[] sir;
        int rbs;
        int r1 = radius + 1;
        int routsum, goutsum, boutsum;
        int rinsum, ginsum, binsum;

        for (y = 0; y < h; y++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            for (i = -radius; i <= radius; i++) {
                p = pix[yi + Math.min(wm, Math.max(i, 0))];
                sir = stack[i + radius];
                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);
                rbs = r1 - Math.abs(i);
                rsum += sir[0] * rbs;
                gsum += sir[1] * rbs;
                bsum += sir[2] * rbs;
                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }
            }
            stackpointer = radius;

            for (x = 0; x < w; x++) {

                r[yi] = dv[rsum];
                g[yi] = dv[gsum];
                b[yi] = dv[bsum];

                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

                if (y == 0) {
                    vmin[x] = Math.min(x + radius + 1, wm);
                }
                p = pix[yw + vmin[x]];

                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);

                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

                stackpointer = (stackpointer + 1) % div;
                sir = stack[(stackpointer) % div];

                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

                yi++;
            }
            yw += w;
        }
        for (x = 0; x < w; x++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            yp = -radius * w;
            for (i = -radius; i <= radius; i++) {
                yi = Math.max(0, yp) + x;

                sir = stack[i + radius];

                sir[0] = r[yi];
                sir[1] = g[yi];
                sir[2] = b[yi];

                rbs = r1 - Math.abs(i);

                rsum += r[yi] * rbs;
                gsum += g[yi] * rbs;
                bsum += b[yi] * rbs;

                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }

                if (i < hm) {
                    yp += w;
                }
            }
            yi = x;
            stackpointer = radius;
            for (y = 0; y < h; y++) {
                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];

                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;

                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];

                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];

                if (x == 0) {
                    vmin[y] = Math.min(y + r1, hm) * w;
                }
                p = x + vmin[y];

                sir[0] = r[p];
                sir[1] = g[p];
                sir[2] = b[p];

                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];

                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;

                stackpointer = (stackpointer + 1) % div;
                sir = stack[stackpointer];

                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];

                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];

                yi += w;
            }
        }

        bitmap.setPixels(pix, 0, w, 0, 0, w, h);

        return (bitmap);
    }
}
使用Android原生制作毛玻璃效果图片 毛玻璃效果,也被称为模糊效果,是许多现代应用中流行的一种视觉效果。在 Android 中,我们可以通过多种方式实现该效果。本文将探讨如何使用 Android 原生的 Bitmap 类和 RenderScript 来实现毛玻璃效果 阅读详情

相关推荐

Android 窗口模糊处理

Android 12 中,我们提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。有两种窗口模糊处理方式,可用于实现不同的视觉效果背景模糊处理:可用于创建具有模糊背景的窗口,创造出磨砂玻璃效果。模糊处理后方屏幕:可用于模糊处理(对话框)窗口后方的整个屏幕,创造出景深效果。仅背景模糊处理 (a)、仅模糊处理后方屏幕 (b)、背景模糊处理和模糊处理后方屏幕 (c)

华南烹鱼宴 5656

Android 10.0 Launcher3单层高斯模糊(毛玻璃)效果的实现

在10.0进行系统Laucher3定制中,有功能需求要求实现高斯模糊(毛玻璃)效果背景效果,在Launcher3中也是常见的功能这就需要了解Workspace的背景定义,然后对背景实现高斯模糊功能,首选要分析加载流程,然后对其背景进行高斯模糊就可以了

安卓兼职framework和app工程师的博客 4545

android dialog背景模糊化效果实现方法

注意: 模糊化图片可能会比较慢, 刚开始测得时候在3 - 4秒之间, 解决办法是将获取到的屏幕进行缩小,然后在进行模糊, 模糊完后, 再将图片放大.这里需要注意: 默认dialog是全屏, activity也是全屏没有状态栏. 如果有状态栏需要获取状态栏大小, 在创建图片的时候减去状态栏大小.最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog背景设为启动acitivity的模糊化图片.3. 将模糊化的图片设为dialog背景。2. 将获取的照片进行模糊化。

qq_29226361的博客 1324

Android中毛玻璃效果的两种实现Android12及以前版本

方法1 先将图片缩小,然后放大图片,再设置为控件背景以达到更模糊的效果,同时也提升模糊算法的处理效率。对比下来同样的模糊半径 ,方法1 的模糊效果更好,且方法1 的模糊半径可以设置范围更大。2.使用Android自带类RenderScript 实现。Android中毛玻璃效果主要有两种实现方式。3.FastBlurUtil.java 类。1.使用JAVA算法FastBlur实现。2.BitmapUtil.java 类。方法2 模糊半径只能设置1-25。1.activity中调用。

kk3087961的博客 3272

Android高斯模糊(毛玻璃效果)蒙层库

ShapeBlurView ShapeBlurView库是一个高斯模糊(毛玻璃效果)蒙层库。Like iOS UIVisualEffectView不知大家做需求的时候是否有这样的效果要求:需求示例大家熟悉的Android常用图片加载库,比如Glide 可以对图片进行毛玻璃效果的加载(实现不展开说了)但是都是对整个要加载的图片进行高斯模糊效果,对应局部这种比较难处理,这个库就能实现这样的效果。当然,...

Android技术之家 4387

android 实现弹窗背景模糊

android 实现弹窗背景模糊(带效果图,带代码,带步骤)

qq_43670077的博客 2664

android9实现背景模糊,android dialog背景模糊化效果实现方法

最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog背景设为启动acitivity的模糊化图片.实现思路:1. 截屏, 获取当前activity的界面2. 将获取的照片进行模糊化3. 将模糊化的图片设为dialog背景1.截屏, 获取当前activity的界面private Bitmap takeScreenShot(Activity activity) ...

weixin_42306055的博客 731

Android 画面设置模糊,android dialog背景模糊化效果实现方法

最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog背景设为启动acitivity的模糊化图片.实现思路:1. 截屏, 获取当前activity的界面2. 将获取的照片进行模糊化3. 将模糊化的图片设为dialog背景1.截屏, 获取当前activity的界面private Bitmap takeScreenShot(Activity activity) ...

weixin_30298279的博客 1081

android 背景毛玻璃模糊化效果实现方法

Android 毛玻璃背景

zjy_android的博客 2776

Android生成模糊化背景图片

在进行android开发的时候,我们可能需要一张模糊的背景图作为activity或者Dialog背景以达到我们想要的效果,这里需要用到一个第三方的类FastBulr.点击下载 调用就一句话 Bitmap newBitmap= FastBulr.doBlur(oldBitmap, 5, true); 5是模糊半径,数值越大,模糊化处理越精细,但同时也越耗时,建议用异步处理,但是这个数

ybw486的博客 2657

Android应用防截屏技术全解析:从FLAG_SECURE原理到实战方案

在移动应用开发中,视图安全与内容保护是保障用户隐私和商业数据安全的重要环节。其核心原理涉及Android系统的窗口管理机制与Surface合成流程,通过控制窗口属性标志位,可以实现对屏幕内容捕获行为的系统级管控。这项技术的核心价值在于为金融交易、企业办公、版权内容等敏感场景提供基础的内容泄露防护能力,防止通过截屏、录屏等方式导致信息外泄。在实际应用中,开发者需要深入理解FLAG_SECURE标志位的工作机制及其边界限制,同时结合动态水印、运行时检测等辅助手段,构建多层次防护体系。本文聚焦Android防截屏

weixin_29323049的博客 258

android 开源 高斯模糊_Android实现带毛玻璃效果(高斯模糊)背景Dialog

最近换了工作,由于工作中要使用一些自己以前不是很了解的知识,就没有时间更新博客了。由于最近做了一些很有意思的小demo,不吐不快,再加上还是认为技术需要沉淀和梳理,所以再次把写博客这件事拾起来。已经不是第一次遇到设计师要求使用毛玻璃效果了,但是做带毛玻璃效果背景Dialog还是第一次。考虑实现的逻辑,弹出Dialog之前对当前屏幕截图,做高斯模糊处理,设为Dialog背景,显示Dialog。屏幕...

weixin_32296949的博客 1158

毛玻璃效果Android的实现

 本文已授权「玉刚说」微信公众号独家发布 毛玻璃效果实际上是对原图片的严重劣化,突出朦胧感,一般都是通过图片的缩放+模糊算法来实现,从性能角度考虑,模糊半径不能大于25,所以要更高的模糊效果则需要进行缩放。具体实现方案有以下几种。 Java实现,一般都是采用Stack模糊算法 RenderScript实现 Native实现 OpenCV或者OpenGL实现,由于其复杂度,本文暂不讨论该方案 关...

weixin_33973609的博客 1165

Android中毛玻璃效果的实践

设置为 true 时,窗口将是半透明的,窗口后面的内容也将是可见的。设置为 false 时,窗口将是不透明的,窗口后面的内容将不可见。通过以上尝试,可以判断出activity对接组件dialog毛玻璃不生效,跟使用的主题有较大关系,但是首页被透明显示的问题未查到根本原因,只知道与。可以实现模糊度效果,但是存在致命问题:Activity弹出后,MainActivity直接被透明了,看到了桌面。可是避免方案1的问题,但是模糊度没办法做到和组件一样,只能通过调节模糊比例,做到近似效果。:Activity利用。

u011835956的专栏 2588

Android实现高斯模糊背景

总结一下,本文介绍了如何在Android应用中实现高斯模糊的背景效果。通过引入相关的依赖库,并使用Blurry库的API,我们可以轻松地将背景图片实现高斯模糊处理,并美化应用的界面。然后,借助Blurry库的API对背景图片进行高斯模糊处理,并将处理后的图片设置为背景容器的背景。上述依赖库中,palette-v7用于提取图片的主题色以便做适当的调整,而blurry则是用于实现高斯模糊效果的库。需要注意的是,以上代码仅为实现高斯模糊背景的关键部分,你还可以在背景容器中添加其他布局元素来完成完整的界面设计。

ByteWhizX的博客 1020

Android进阶之路 - 毛玻璃遮罩层

目录 前期提要 使用方式 完整代码 前期提要 更具体的详情请查看文末的借鉴文章之处 > <~ 模糊方案 1.Java实现,一般都是采用Stack模糊算法 2.RenderScript实现 3.Native实现 4.OpenCV或者OpenGL实现,由于其复杂度,本文暂不讨论该方案 BlurLayout自定义属性 注:只用到了blurkit:blk_fps属性,其他属性一用就...

Android、前端、小程序、后端 1万+

Android 毛玻璃 高斯模糊 五种方法,赶紧用

需求:Android实现模糊真的很烦,每次UI画出来就觉得真的很烦。一般不会做,每次做就觉得有点烦,有时候是模糊图片,有时候是模糊有个背景。因为遇到模糊的需求的时候比较少,所以也没总结。这次遇到了,还让我走了好些绕路。这次进行个小小总结。总结了用到的五种实现方式。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 9683

Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果

介绍Android12如何实现高斯模糊的效果

AfinalStone的专栏 2万+

关于安卓毛玻璃实现(一)动态毛玻璃

动态毛玻璃

motosheep的博客 1949
上一篇: linux poll与epoll模型简介
下一篇: Android ActionBar使用笔记
lbcab
博客等级 码龄14年 33粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值