本文转载自:http://www.2cto.com/kf/201508/427387.html
一、利用android api实现高斯模糊
关于高斯模糊网上已经有很多不错的文章介绍了,在这里就不重复了。
效果已经看到了,就来看看怎么实现的吧。首先是实现高斯模糊的核心代码
public static Bitmap blurBitmap(Bitmap bitmap, Context context) {
// 用需要创建高斯模糊bitmap创建一个空的bitmap
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
// 初始化Renderscript,这个类提供了RenderScript context,在创建其他RS类之前必须要先创建这个类,他控制RenderScript的初始化,资源管理,释放
RenderScript rs = RenderScript.create(context);
// 创建高斯模糊对象
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
// 创建Allocations,此类是将数据传递给RenderScript内核的主要方法,并制定一个后备类型存储给定类型
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
// 设定模糊度
blurScript.setRadius(25.f);
// Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
// Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
// recycle the original bitmap
bitmap.recycle();
// After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
}
然后是调用部分
public static Bitmap getBlurBitmap(View rootView, Context context) {
try {
if (rootView == null || context == null) {
return null;
}
rootView.setDrawingCacheEnabled(true);
Bitmap drawingCache = rootView.getDrawingCache();
Bitmap bgBitmap = Bitmap.createBitmap(drawingCache);
return BitmapUtil.blurBitmap(bgBitmap, context);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这样就可以就实现了高斯模糊效果,再将模糊效果显示在界面上就可以了。
二、兼容低版本
android有一个很麻烦的东西就是需要兼容的版本很多,按照上面的方式实现了,在4.2及以上的版本就可以轻松出效果了,但是在低版本就会出异常:java.lang.NoClassDefFoundError: android.renderscript.ScriptIntrinsicBlur。导致这个问题就是因为这个api不能向下兼容,现在我们就来解决这个问题。其实google早就提供了方案,我们只需要使用就好了。
1、引入renderscript-v8.jar
2、将sdk\build-tools\19.1.0\renderscript\lib\packaged下的armeabi-v7a、mips、x86拷贝到libs目录下
注:这些资源都是在sdk中包含,我的是在:sdk\build-tools\19.1.0\renderscript下,你们可以找找你们自己的目录 到这里就可以完美的兼容4.2以下的版本了。