❶ Android上如何做出毛玻璃模糊的效果
上圖展示了一種很典型的視覺效果——文字的背景不再是固定的,而是將底層的相應區域模糊化,好似蓋了一層毛玻璃。
其原理也很簡單,分為三步走:
裡面涉及到的技術點有兩個:
ViewTreeObserver裡面有一個監聽器為OnPreDrawListener
當它執行時,布局文件經過了 measured 、 laid out 、 displayed ,即將被繪制到屏幕,此時調用它的 getDrawingCache() 方法可以獲得其Bitmap。完整方法如下:
方案有兩種:
兩種方案都可以進行對Bitmap對象的模糊處理,但當模糊半徑增大時,StackBlur能夠保持較好的性能,且不受Renderscript半徑25px的限制。
在GitHub項目有一個項目 blurring ,其實現了StackBlur演算法的Java實現版FastBlur,並給出兩種方案效率對比demo。經過測試,
看起來,Renderscript的性能更好,應該是Android上對Renderscript做了優化。盡管如此,考慮到Android中渲染一幀的時間應該不超過16ms(60fps),這樣的性能並不友好。 blurring 作者想出了另外一種思路:
這時候,效率提升非常明顯:
生成的模糊圖片當然有所不同,但是都是模糊背景,所以對用戶而言沒有太大差別。
好了,至此Android上製作毛玻璃背景模糊效果的技術都確定了。
我在 blurring 基礎上做了封裝,介面如下:
相對應類有兩個: