package net.robinx.lib.blur.widget; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.view.View; import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import net.robinx.lib.blur.StackBlur; import net.robinx.lib.blur.utils.BlurUtils; /** * Created by Robin on 2016/7/23 14:06. */ public class BlurMaskRelativeLayout extends RelativeLayout { private int mBlurRadius = 1; private Bitmap mScreenBitmap; private Bitmap mBitmap; private float mOffsetX; private float mOffsetY; private int mCompressFactor = 8; private int BLUR_MODE = BlurMode.NATIVE_PIXELS; public BlurMaskRelativeLayout(Context context) { super(context); init(); } public BlurMaskRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BlurMaskRelativeLayout(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); blur(); return true; } }); } private void blur() { //screen bitmap View view = ((Activity) getContext()).getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); mScreenBitmap = view.getDrawingCache(); //original bitmap mBitmap = Bitmap.createBitmap( (getMeasuredWidth()),(getMeasuredHeight()), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(mBitmap); canvas.translate(-getLeft()-mOffsetX, -getTop()- BlurUtils.getStatusBarHeight(getContext())-mOffsetY); canvas.drawBitmap(mScreenBitmap, 0, 0, null); //compress bitmap Matrix matrix = new Matrix(); matrix.postScale(1.0f / mCompressFactor, 1.0f / mCompressFactor); mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); //blur bitmap switch (BLUR_MODE) { case BlurMode.RENDER_SCRIPT: mBitmap = StackBlur.blurRenderScript(getContext(),mBitmap, mBlurRadius, false); break; case BlurMode.NATIVE_PIXELS: mBitmap = StackBlur.blurNativelyPixels(mBitmap, mBlurRadius, false); break; case BlurMode.NATIVE_BITMAP: mBitmap = StackBlur.blurNatively(mBitmap, mBlurRadius, false); break; case BlurMode.JAVA: mBitmap = StackBlur.blurJava(mBitmap, mBlurRadius, false); break; } setBackgroundDrawable(new BitmapDrawable(getResources(), mBitmap)); } public BlurMaskRelativeLayout blurRadius(int blurRadius) { mBlurRadius = blurRadius; return this; } public BlurMaskRelativeLayout offsetX(float offsetX) { mOffsetX = offsetX; return this; } public BlurMaskRelativeLayout offsetY(float offsetY) { mOffsetY = offsetY; return this; } public BlurMaskRelativeLayout compressFactor(int compressFactor) { mCompressFactor = compressFactor; return this; } public BlurMaskRelativeLayout blurMode(int blurMode) { this.BLUR_MODE = blurMode; return this; } public void refresh(){ invalidate(); } public void update(){ blur(); } }