前言
與目前市場上的其他移動平臺相比,基于 Java 語言的 Android 系統(tǒng)在執(zhí)行計算密集型(Computationally intensive)任務(wù)時是很慢的。為此,Android 系統(tǒng)提供了 RenderScript 這個框架,該框架可以充分利用設(shè)備的多核性能來高效的執(zhí)行計算算法。然而,早期的 RenderScript 僅支持 Android 4.3 及以上版本。不過幸運的是,后面 Google 又推出了 RenderScript 的兼容包,使其可以在 Android 2.2 及以上的系統(tǒng)中正常執(zhí)行。
集成 RenderSript Support Library
如果你還在使用 Eclipse + ADT 作為你的開發(fā)環(huán)境,那么要想集成 RenderScriprt Support Library 到你的工程還是比較麻煩的。所以在這里我先假定你的開發(fā)環(huán)境是 Android Studio,Eclipse 使用者則請另行查閱。
提到 Android Studio,那么自然而然的就會想到與它相綁定的一個自動化構(gòu)建工具 Gradle。沒錯,我們只需要在 module(如 app) 目錄下的 build.gradle 文件中添加如下兩行代碼即可,同時也不需要再申明其他任何的依賴。不過配置信息還是要根據(jù)你當(dāng)前使用的 Gradle 版本進行相應(yīng)修改:
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及以上的設(shè)備,請正確選擇 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;
}
}
上面代碼就簡單實現(xiàn)了將一個 Bitmap 資源進行模糊處理,然后我們就可以調(diào)用了:
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())));
最終效果如下: