Android 5.0 下毛玻璃(磨砂)效果如何实现?

最近要做一款产品,是在Android手机上的一个launcher应用,PM想实现出和水果手机一样的毛玻璃效果,但是真心好难。搞了好几天调研了好久,彻底…
关注者
579
被浏览
92,331

8 个回答

刚刚做技术调研,可以给一些优缺点的对比.

目前主流实现毛玻璃效果(高斯模糊)分大致三种方法:


一 利用RenderScript接口

利用现有Android结构,通过RenderScript调用底层接口实现高斯模糊计算.

// Remix Blur
private void blur(Bitmap bkg, View view) {
    
    RenderScript rs = RenderScript.create(getActivity());
    Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
    ScriptIntrinsicBlur blur = 
        ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
    blur.setInput(overlayAlloc);
    blur.setRadius(radius);
    blur.forEach(overlayAlloc);
    overlayAlloc.copyTo(overlay);
    view.setBackground(new BitmapDrawable(getResources(), overlay));
    rs.destroy();
}

说明 :

这种方法直接利用Android系统提供的机制, 从代码实现上是最简单也相对高效的实现. 在此过程中遇到的很现实的问题是: 1. 当模糊半径 (radius)变大后会直接出现计算性能问题. 2. ScriptIntrinsicBlur脚本模糊半径不能大于25. 因此, 直接使用ScriptIntrinsicBlur不能得到模糊程度较高的图片.

考虑到高斯模糊是计算周边像素平均值,在模糊程度很高的情况下,逐点计算平均值从显示效果上优势并不明显.可以通过将图片压缩成小图,计算小图的高斯模糊, 再将小图放大的方法来模拟大半径高斯模糊的效果.

效果如图:模糊前/模糊后



二 在低版本Android中通过Java实现高斯模糊

可以参考如下代码实现

blurring/FastBlur.java at master · paveldudka/blurring · GitHubva

这种方式通过在Java层中直接实现高斯模糊算法.在大模糊半径和大图片情况下,性能会出现问题.基本目前只作为对低版本Android客户端的兼容性方案使用.



三 通过OpenGL直接实现

没有具体实践过, 可以参考muzei壁纸的实现, 无论从效果和实时性来讲都是最好的. 但需要根据需求来看是否真的有这样的实时性要求. 这种方式从显示效果上会优于第一种方法,甚至可以达到渐变的效果.但这些计算都是以耗电作为代价的. 作为Launcher这种系统级别的应用, 在显示效果差异并不明显的情况下, 建议综合考虑耗电量, 以及内存和计算性能的消耗.

如图:


此功能已经在RemixOS上实现, jide.com

参考这篇:

Android高级模糊技术

这篇文章介绍了几种类型的模糊技术.

其中一个关键技巧是: 先压缩原图大小再高斯. 这样能够大大减少高斯计算量, 提高性能.