Android毛玻璃模糊化效果处理

三种方法

第一种:比较简单,性能比较低

/**
     * 通过调用系统高斯模糊api的方法模糊
     *
     * @param bitmap  source bitmap
     * @param radius  0 < radius <= 25
     * @param context context
     * @return out bitmap
     */
    public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) {
        //Let‘s create an empty bitmap with the same size of the bitmap we want to blur
        Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                Bitmap.Config.ARGB_8888);

//Instantiate a new Renderscript
        android.renderscript.RenderScript rs = android.renderscript.RenderScript.create(context);

//Create an Intrinsic Blur Script using the Renderscript
        android.renderscript.ScriptIntrinsicBlur blurScript = android.renderscript.ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));

//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
        android.renderscript.Allocation allIn = android.renderscript.Allocation.createFromBitmap(rs, bitmap);
        android.renderscript.Allocation allOut = android.renderscript.Allocation.createFromBitmap(rs, outBitmap);

//Set the radius of the blur
        blurScript.setRadius(radius);

//Perform the Renderscript
        blurScript.setInput(allIn);
        blurScript.forEach(allOut);

//Copy the final bitmap created by the out Allocation to the outBitmap
        allOut.copyTo(outBitmap);

//recycle the original bitmap
        //        bitmap.recycle();

//After finishing everything, we destroy the Renderscript.
//        view.setBackground(new BitmapDrawable(context.getResources(), outBitmap));
        rs.destroy();

return outBitmap;
    }

第二种:性能比第一种要高
    /**
     *@param
     *@描述  快速模糊化处理bitmap
     *@作者  tll
     *@时间  2016/12/5 19:22
     */
    public 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 temp = 256 * divsum;
        int dv[] = new int[temp];
        for (i = 0; i < temp; 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);
    }

第三种是利用开源框架实现,框架地址:https://github.com/500px/500px-android-blur,可以直接将jar包项目下载下来导入到自己项目中。

在gradle中添加

dependencies {    compile project(‘:blurringview‘)

settings.gradle增加
include ‘:app‘, ‘:blurringview‘
 使用
mBlurringView = (BlurringView) findViewById(R.id.blurring_view);View blurredView = findViewById(R.id.blurred_view);// Give the blurring view a reference to the blurred view.mBlurringView.setBlurredView(blurredView);

有更新时需要调用mBlurringView.invalidate();

时间: 2024-11-19 10:10:23

Android毛玻璃模糊化效果处理的相关文章

Android 毛玻璃效果的实现

Android 毛玻璃效果,主要找到了3中实现方案, 1.如果系统的api在16以上,可以使用系统提供的方法直接处理图片 if (Build.VERSION.SDK_INT > 16) { <span style="white-space:pre"> </span>Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); <span style="white-space:p

Android 导航条效果实现(六) TabLayout+ViewPager+Fragment

TabLayout 一.继承结构 public class TabLayout extends HorizontalScrollView java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.HorizontalScrollView ? android.support.design.widget.TabLayout 二.TabLayou

Android自定义弹窗效果

Android的弹窗效果有很多种,就最简单而言,就可以调用一个AlertDialog弹窗显示,可是要自定义弹窗效果有以下这种方法,就我个人而言感觉挺方便的,适用性也挺广的. 首先先简单写个AlertDialog的使用 public void showDialog(){ AlertDialog dialog = new AlertDialog.Builder(this) .setTitle("提示") .setMessage(getResources().getString("

实现Android半透明Menu效果的开发实例

不知道大家是否用过天天动听,对于它界面上的半透明Menu效果,笔者感觉非常漂亮.下面是天天动听半透明Menu的截图,欣赏下吧: 感觉还不错吧?那么如何实现这种半透明Menu效果呢?本文就重点讨论并给出这种Menu的具体代码实现过程. 首先分析下实现这种半透明Menu所需做的工作,并进行合理分解: 1.  利用Shaper设置一个半透明圆角背景. 2.  定义Menu布局,主要就GridView,把图标都放在这个GridView. 3.  Menu事件, 通过PopupWindow或者AlertD

【Android】时光轴效果

[Android]时光轴效果 支持平台:Android   运行环境:Eclipse   开发语言:Java 下载地址:http://t.cn/R71Ge5c 源码简介 利用ExpandableListView通过对布局的控制来实现时光轴效果,只要有点耐心,你,也可以~ 源码运行图

iOS 模糊化效果 ANBlurredImageView的使用

/** *  背景模糊化效果 */ - (void)resetBlurView { ANBlurredImageView *blurView = self.commentBackground; // 创建ANBlurredImageView类型的属性 blurView.baseImage = [self screenShots]; blurView.blurAmount = 0.3; // 设置透明度 __weak typeof (self) weakP = self; BLOCK_BACKGR

我收集了多个android界面UI效果,深感大哥们的分享啊

初到oschina,看到很多大哥们分享了很好好的代码,近段时间,我收集了多个android界面UI效果,深感大哥们的分享啊.后来我将这些界面效果整合拢来,形成一个大的特效集合,一来为了查看方便,二来也为拷贝复制便捷.今日,将其共享出来,也算是为资源共享出一分力嘛. 直接上效果图: 可以看到上图中几个效果图,最上面九宫格图.左边一个是图书翻页效果图,都是比较经典的UI效果,当然还有很多,这些都是来源于oschina上的分享. 不过想说明一下,有部分地方小弟私自改动了,还请原作者原谅.例如,水波纹的

android anim 动画效果(转)

动画效果编程基础--AnimationAndroid      动画类型      Android的animation由四种类型组成      XML中    alpha    渐变透明度动画效果    scale    渐变尺寸伸缩动画效果    translate    画面转换位置移动动画效果    rotate    画面转移旋转动画效果        JavaCode中    AlphaAnimation    渐变透明度动画效果    ScaleAnimation    渐变尺寸伸缩

写一个android带动画效果的TabHost(类似微博客户端的切换效果)

先上图: 这个Layout是: <?xml version="1.0" encoding="UTF-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" andro