package net.robinx.lib.blur; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.os.Build; import android.renderscript.Allocation; import android.renderscript.Element; import android.renderscript.RenderScript; import android.renderscript.ScriptIntrinsicBlur; /** * Created by Robin on 2016/7/23 17:13. */ public class StackRenderScript { private static volatile StackRenderScript INSTANCE = null; public static StackRenderScript getInstance(Context context) { if (INSTANCE == null) { synchronized (StackRenderScript.class) { if (INSTANCE == null) { INSTANCE = new StackRenderScript(context.getApplicationContext()); } } } return INSTANCE; } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private StackRenderScript(Context context){ mRenderScript = RenderScript.create(context); mBlurScript = ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript)); } private RenderScript mRenderScript; private ScriptIntrinsicBlur mBlurScript; private Allocation mBlurInput, mBlurOutput; /** * * @param bitmap * @param radius 0~25 * @return */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public Bitmap blur(Bitmap bitmap, int radius){ if (radius < 1) { return (null); } // Return this none blur if (radius == 1) { return bitmap; } if (radius > 25) { radius = 25; } mBlurScript.setRadius(radius); mBlurInput = Allocation.createFromBitmap(mRenderScript, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); mBlurOutput = Allocation.createTyped(mRenderScript, mBlurInput.getType()); //mBlurInput.copyFrom(bitmap); mBlurScript.setInput(mBlurInput); mBlurScript.forEach(mBlurOutput); mBlurOutput.copyTo(bitmap); return (bitmap); } }