BlurImageView in Android
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.LightingColorFilter;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
public class BlurImageView extends View {
private static final float BLUR_RADIUS = 25f;
private Bitmap originalBitmap;
private Bitmap blurredBitmap;
private Paint paint;
public BlurImageView(Context context, Bitmap bitmap) {
super(context);
originalBitmap = bitmap;
paint = new Paint();
paint.setAntiAlias(true);
// Blur the bitmap
blurredBitmap = Bitmap.createBitmap(originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(blurredBitmap);
canvas.drawBitmap(originalBitmap, 0, 0, paint);
paint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00000000));
canvas.drawBitmap(blurredBitmap, 0, 0, paint);
blurBitmap(blurredBitmap);
// Set the blurred bitmap as the background of the view
Drawable drawable = new BitmapDrawable(getResources(), blurredBitmap);
setBackground(drawable);
}
private void blurBitmap(Bitmap bitmap) {
Bitmap outputBitmap = Bitmap.createBitmap(bitmap);
RenderScript rs = RenderScript.create(getContext());
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
Allocation tmpIn = Allocation.createFromBitmap(rs, bitmap);
Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
theIntrinsic.setRadius(BLUR_RADIUS);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
bitmap.recycle();
rs.destroy();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Draw the original bitmap on top of the blurred bitmap with a PorterDuffXfermode
Rect rect = new Rect(0, 0, getWidth(), getHeight());
RectF rectF = new RectF(rect);
canvas.drawBitmap(originalBitmap, null, rect, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
canvas.drawBitmap(blurredBitmap, null, rect, paint);
paint.setXfermode(null);
}
}