前言
与目前市场上的其他移动平台相比,基于 Java 语言的 Android 系统在执行计算密集型(Computationally intensive)任务时是很慢的。为此,Android 系统提供了 RenderScript 这个框架,该框架可以充分利用设备的多核性能来高效的执行计算算法。然而,早期的 RenderScript 仅支持 Android 4.3 及以上版本。不过幸运的是,后面 Google 又推出了 RenderScript 的兼容包,使其可以在 Android 2.2 及以上的系统中正常执行。
集成 RenderSript Support Library
如果你还在使用 Eclipse + ADT 作为你的开发环境,那么要想集成 RenderScriprt Support Library 到你的工程还是比较麻烦的。所以在这里我先假定你的开发环境是 Android Studio,Eclipse 使用者则请另行查阅。
提到 Android Studio,那么自然而然的就会想到与它相绑定的一个自动化构建工具 Gradle。没错,我们只需要在 module(如 app) 目录下的 build.gradle 文件中添加如下两行代码即可,同时也不需要再申明其他任何的依赖。不过配置信息还是要根据你当前使用的 Gradle 版本进行相应修改:
Gradle version 0.14+
android {
defaultConfig {
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
}
}
Gradle version 0.13-
android {
defaultConfig {
renderscriptTargetApi 19
renderscriptSuppoertMode true
}
}
接下来只需同步一下工程我们就可以使用 RenderScript Support Library。这里需要注意的是,为了能使我们的工程运行在 Android 2.2及以上的设备,请正确选择 android.support.v8.renderscript.*
包下的类。如果你不考虑兼容低版本,那直接使用 android.renderscript.*
就可以了。
使用 RenderScript Support Library 对我们的图片进行模糊处理
完成上述的配置后,我们就可以使用 RenderSrcipt 来处理我们的图片了。Talk is cheap,show me the code:
public class BlurBuilder {
private static final float BLUR_RADIUS = 7.5F;
public static Bitmap blur(Context context, Bitmap inputBitmap) {
Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
RenderScript renderScript = RenderScript.create(context);
ScriptIntrinsicBlur scriptIntrinsicBlur =
ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
Allocation tmpIn = Allocation.createFromBitmap(renderScript, inputBitmap);
Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);
scriptIntrinsicBlur.setRadius(BLUR_RADIUS);
scriptIntrinsicBlur.setInput(tmpIn);
scriptIntrinsicBlur.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
return outputBitmap;
}
}
上面代码就简单实现了将一个 Bitmap 资源进行模糊处理,然后我们就可以调用了:
ImageView ivPhoto = (ImageView) findViewById(R.id.iv_photo);
BitmapDrawable bitmapDrawable =
(BitmapDrawable) ContextCompat.getDrawable(getApplicationContext(), R.mipmap.ic_launcher);
ivPhoto.setImageDrawable(new BitmapDrawable(getResources(),
BlurBuilder.blur(getApplicationContext(), bitmapDrawable.getBitmap())));
最终效果如下: