最近项目中遇到了毛玻璃效果,实现过程中在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)
方法二: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