diff --git a/library/build.gradle b/library/build.gradle index 9bbb26a..69a767c 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -59,7 +59,7 @@ publish { userOrg = 'mmin18' groupId = 'com.github.mmin18' artifactId = 'realtimeblurview' - publishVersion = '1.2.1' + publishVersion = '1.3.0' desc = 'A realtime blurring overlay for Android (like iOS UIVisualEffectView)' website = 'https://github.com/mmin18/RealtimeBlurView' } diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index 7cd0278..111f8f9 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -4,5 +4,6 @@ + \ No newline at end of file diff --git a/library/src/com/github/mmin18/widget/RealtimeBlurView.java b/library/src/com/github/mmin18/widget/RealtimeBlurView.java index 157ba1e..09c4097 100644 --- a/library/src/com/github/mmin18/widget/RealtimeBlurView.java +++ b/library/src/com/github/mmin18/widget/RealtimeBlurView.java @@ -7,6 +7,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Rect; import android.os.Build; import android.util.AttributeSet; @@ -23,6 +24,7 @@ *
  • realtimeBlurRadius (10dp)
  • *
  • realtimeDownsampleFactor (4)
  • *
  • realtimeOverlayColor (#aaffffff)
  • + *
  • realtimeIsCircle (false)
  • * */ public class RealtimeBlurView extends View { @@ -30,6 +32,9 @@ public class RealtimeBlurView extends View { private float mDownsampleFactor; // default 4 private int mOverlayColor; // default #aaffffff private float mBlurRadius; // default 10dp (0 < r <= 25) + private boolean mIsCircle = false, // default false + isCircleDrawn = false; + private final BlurImpl mBlurImpl; private boolean mDirty; @@ -56,6 +61,7 @@ public RealtimeBlurView(Context context, AttributeSet attrs) { TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, context.getResources().getDisplayMetrics())); mDownsampleFactor = a.getFloat(R.styleable.RealtimeBlurView_realtimeDownsampleFactor, 4); mOverlayColor = a.getColor(R.styleable.RealtimeBlurView_realtimeOverlayColor, 0xAAFFFFFF); + mIsCircle = a.getBoolean(R.styleable.RealtimeBlurView_realtimeIsCircle, false); a.recycle(); mPaint = new Paint(); @@ -270,7 +276,16 @@ public boolean onPreDraw() { mBlurringCanvas.restoreToCount(rc); } - blur(mBitmapToBlur, mBlurredBitmap); + if(mIsCircle) { + if(!isCircleDrawn) { + isCircleDrawn = true; + mBitmapToBlur = getBitmapClippedCircle(mBitmapToBlur); + + blur(mBitmapToBlur, mBlurredBitmap); + } + } else { + blur(mBitmapToBlur, mBlurredBitmap); + } if (redrawBitmap || mDifferentRoot) { invalidate(); @@ -351,11 +366,41 @@ protected void drawBlurredBitmap(Canvas canvas, Bitmap blurredBitmap, int overla canvas.drawBitmap(blurredBitmap, mRectSrc, mRectDst, null); } mPaint.setColor(overlayColor); - canvas.drawRect(mRectDst, mPaint); - } - private static class StopException extends RuntimeException { + if(mIsCircle) { + canvas.drawCircle(getWidth() / 2f, getHeight() / 2f, getWidth() / 2f, mPaint); + } else { + canvas.drawRect(mRectDst, mPaint); + } } + /** + * https://stackoverflow.com/a/15489830 + * + * @param bitmap - the Bitmap that needs to be circle clipped + * @return - returns the new clipped Bitmap + */ + public static Bitmap getBitmapClippedCircle(Bitmap bitmap) { + + final int width = bitmap.getWidth(); + final int height = bitmap.getHeight(); + final Bitmap outputBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + + final Path path = new Path(); + path.addCircle( + (float)(width / 2) + , (float)(height / 2) + , (float) Math.min(width, (height / 2)) + , Path.Direction.CCW); + + final Canvas canvas = new Canvas(outputBitmap); + canvas.clipPath(path); + canvas.drawBitmap(bitmap, 0, 0, null); + return outputBitmap; + } + + private static class StopException extends RuntimeException { } + private static StopException STOP_EXCEPTION = new StopException(); + }