❶ 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 基础上做了封装,接口如下:
相对应类有两个: