最近項目中遇到了毛玻璃效果,實現過程中在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