嘗試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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章