首先是生成背景的Bitmap:
private Bitmap createViewBitmap(View view) {
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
Bitmap cacheBitmap = null;
if (bitmap != null)
cacheBitmap = Bitmap.createBitmap(bitmap);
view.destroyDrawingCache();
view.setDrawingCacheEnabled(false);
return cacheBitmap;
}
其次是将Bitmap进行虚化:
其中的setRadius最大只能设置为25,否则报错,len是进行虚化的次数,设置16是这个效果比较适合项目。
private Bitmap blurBitmap(Bitmap bitmap) {
if (bitmap != null) {
mRenderScript = RenderScript.create(mContext);
Bitmap outBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight());
int len = 16;
for (int i = 0; i < len; i++) {
ScriptIntrinsicBlur scriptIntrinsicBlur =
ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript));
final Allocation inAllocation =
Allocation.createFromBitmap(mRenderScript, bitmap),
outAllocation = Allocation.createFromBitmap(mRenderScript, outBitmap);
scriptIntrinsicBlur.setRadius(25);
scriptIntrinsicBlur.setInput(inAllocation);
scriptIntrinsicBlur.forEach(outAllocation);
outAllocation.copyTo(outBitmap);
bitmap.recycle();
bitmap = Bitmap.createBitmap(outBitmap, 0, 0,
outBitmap.getWidth(), outBitmap.getHeight());
}
mRenderScript.destroy();
mRenderScript = null;
return outBitmap;
}
return null;
}
将生成的Bitmap保存到本地,下次就不用再重新虚化了:
try {
File photoDir = new File(Environment.getExternalStorageDirectory() + "/ima g");
photoDir.mkdir();
File file = new File(photoDir, "home_page_dialog_background.png");
Log.d("tag",file.getPath());
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
mDialogBackground.compress(Bitmap.CompressFormat.PNG,100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}