尝试Android的毛玻璃(Blur)效果

最近项目中遇到了毛玻璃效果,实现过程中在github上查了很多代码。

看过一些方法的实现,大多都是需要一张图片,一个ImageView。

由于项目的限制,我需要像苹果系统那样,把整个屏幕都变成毛玻璃效果,因此筛选之后实现了

整理一下逻辑:

1、获取屏幕View

2、将View转换为Bitmap

private Bitmap view2Bitmap(View v) {
    int w = v.getWidth();
    int h = v.getHeight();
    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bmp);
    c.drawColor(Color.WHITE); //如果不设置颜色,默认是透明背景
    v.layout(0, 0, w, h);
    v.draw(c);

    return bmp;
}

3、压缩Bitmo(尺寸压缩,可选,后面作解释)

int scaledRatio = 10; //尺寸压缩比例
bmp = Bitmap.createScaledBitmap(bmp, bmp.getWidth() / scaledRatio, bmp.getHeight() / scaledRatio, false);

4、毛玻璃效果

方法一:BlurImageView(StackBlur模糊算法)

来自giihub,直接使用该方法即可(无需导入项目)

public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {};
传入参数:需要处理的Bitmap,模糊半径(数值越大越模糊),是否使用复用传入的Bitmap(false会复制一个Bitmap)
传出参数:模糊后的Bitmap

方法二:RenderScript(ScriptIntrinsicBlur,API17)

private Bitmap blur(Bitmap bmp, @IntRange(from = 1, to = 25) int radius) {
    RenderScript rs = RenderScript.create(this);
    Allocation allocFromBmp = Allocation.createFromBitmap(rs, bmp);
    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, allocFromBmp.getElement());
    blur.setInput(allocFromBmp);
    blur.setRadius(radius);
    blur.forEach(allocFromBmp);
    allocFromBmp.copyTo(bmp);
    rs.destroy();
   
    return bmp;
}

传入参数:需要处理的Bitmap,模糊半径(范围1~25,因此无法得到非常模糊的图)
传出参数:模糊后的Bitmap


5、显示(Bitmap转Drawable)

有了Bitmap就不在局限于只能显示在ImageView里,还可以给任何一个View设置Background;

再加上透明度的动画就完美了;

view.setBackground(new BitmapDrawable(null, bmp)); // Bitmap转换成Drawable
AlphaAnimation anim = new AlphaAnimation(0, 1); //从0(透明)到1(不透明)
anim.setDuration(300); //动画时长300msview.setAnimation(anim);anim.startNow(); //立即开始动画
view.setVisibility(View.VISIBLE);



TIPS:

a、方法一中的Bitmap一定要是isMutable(可改变的),否则会抛出异常:因为当中调用了Bitmap的setPixels方法

public void setPixels(@ColorInt int[] pixels, int offset, int stride, int x, int y, int width, int height) {};
if (!isMutable()) {
    throw new IllegalStateException();
}

b、方法二中Bitmap的色彩格式最好是ARGB_8888而不要是RGB_565,否则容易出现花屏现象。


c、关于效率:如果不进行尺寸压缩,两个方法的模糊效率都不是很高(可以说是很慢的)。

图片尺寸是影响效率的重要因素之一,而且做毛玻璃效果一般情况下不要求画质的清晰度。

因此建议上述的第三步一定要有(亲测效率差别很大),压缩比例可根据效果调整。


鸣谢:

wingjay:http://www.jianshu.com/p/7ae7dfe47a70


你可能感兴趣的:(Android学习,问题与解决)