package net.robinx.lib.blur.widget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import net.robinx.lib.blur.StackBlur; /** * Created by Robin on 2016/7/23 11:51. */ public class BlurRelativeLayout extends RelativeLayout{ private int mBlurRadius = 30; private int mCompressFactor = 8; private int BLUR_MODE = BlurMode.NATIVE_PIXELS; public BlurRelativeLayout(Context context) { super(context); init(); } public BlurRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BlurRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(this); //original bitmap /*Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); draw(new Canvas(bitmap));*/ setDrawingCacheEnabled(true); buildDrawingCache(); Bitmap bitmap = getDrawingCache(); //compress bitmap Matrix matrix = new Matrix(); matrix.postScale(1.0f / mCompressFactor, 1.0f / mCompressFactor); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); //blur bitmap switch (BLUR_MODE) { case BlurMode.RENDER_SCRIPT: bitmap = StackBlur.blurRenderScript(getContext(),bitmap, mBlurRadius, false); break; case BlurMode.NATIVE_PIXELS: bitmap = StackBlur.blurNativelyPixels(bitmap, mBlurRadius, false); break; case BlurMode.NATIVE_BITMAP: bitmap = StackBlur.blurNatively(bitmap, mBlurRadius, false); break; case BlurMode.JAVA: bitmap = StackBlur.blurJava(bitmap, mBlurRadius, false); break; } setBackgroundDrawable(new BitmapDrawable(getResources(),bitmap)); return true; } }); } public BlurRelativeLayout blurRadius(int blurRadius) { mBlurRadius = blurRadius; return this; } public BlurRelativeLayout compressFactor(int compressFactor) { mCompressFactor = compressFactor; return this; } public BlurRelativeLayout blurMode(int blurMode) { this.BLUR_MODE = blurMode; return this; } }