Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
1 change: 1 addition & 0 deletions library/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<attr name="realtimeBlurRadius" format="dimension"/>
<attr name="realtimeDownsampleFactor" format="float"/>
<attr name="realtimeOverlayColor" format="color"/>
<attr name="realtimeIsCircle" format="boolean"/>
</declare-styleable>
</resources>
53 changes: 49 additions & 4 deletions library/src/com/github/mmin18/widget/RealtimeBlurView.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,13 +24,17 @@
* <li>realtimeBlurRadius (10dp)</li>
* <li>realtimeDownsampleFactor (4)</li>
* <li>realtimeOverlayColor (#aaffffff)</li>
* <li>realtimeIsCircle (false)</li>
* </ul>
*/
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;
Expand All @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();

}