Blur a View
suggest changeBlurBitmapTask.java
public class BlurBitmapTask extends AsyncTask<Bitmap, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private final RenderScript renderScript; private boolean shouldRecycleSource = false; public BlurBitmapTask(@NonNull Context context, @NonNull ImageView imageView) { // Use a WeakReference to ensure // the ImageView can be garbage collected imageViewReference = new WeakReference<>(imageView); renderScript = RenderScript.create(context); } // Decode image in background. @Override protected Bitmap doInBackground(Bitmap... params) { Bitmap bitmap = params[0]; return blurBitmap(bitmap); } // Once complete, see if ImageView is still around and set bitmap. @Override protected void onPostExecute(Bitmap bitmap) { if (bitmap == null || isCancelled()) { return; } final ImageView imageView = imageViewReference.get(); if (imageView == null) { return; } imageView.setImageBitmap(bitmap); } public Bitmap blurBitmap(Bitmap bitmap) { // https://plus.google.com/+MarioViviani/posts/fhuzYkji9zz //Let's create an empty bitmap with the same size of the bitmap we want to blur Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); //Instantiate a new Renderscript //Create an Intrinsic Blur Script using the Renderscript ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); //Create the in/out Allocations with the Renderscript and the in/out bitmaps Allocation allIn = Allocation.createFromBitmap(renderScript, bitmap); Allocation allOut = Allocation.createFromBitmap(renderScript, outBitmap); //Set the radius of the blur 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 // nope, we are using the original bitmap as well :/ if (shouldRecycleSource) { bitmap.recycle(); } //After finishing everything, we destroy the Renderscript. renderScript.destroy(); return outBitmap; } public boolean isShouldRecycleSource() { return shouldRecycleSource; } public void setShouldRecycleSource(boolean shouldRecycleSource) { this.shouldRecycleSource = shouldRecycleSource; } }
Usage:
ImageView imageViewOverlayOnViewToBeBlurred .setImageDrawable(ContextCompat.getDrawable(this, android.R.color.transparent)); View viewToBeBlurred.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW); viewToBeBlurred.setDrawingCacheEnabled(true); BlurBitmapTask blurBitmapTask = new BlurBitmapTask(this, imageViewOverlayOnViewToBeBlurred); blurBitmapTask.execute(Bitmap.createBitmap(viewToBeBlurred.getDrawingCache())); viewToBeBlurred.setDrawingCacheEnabled(false);
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents