From f9eac321bb25ab3d6edfb555cf92207dd1f9bb90 Mon Sep 17 00:00:00 2001 From: wangxin Date: Tue, 6 Jun 2017 15:37:16 +0800 Subject: [PATCH] Add inner line relational functions --- .../main/java/com/yalantis/ucrop/UCrop.java | 8 ++ .../com/yalantis/ucrop/UCropActivity.java | 18 ++- .../com/yalantis/ucrop/view/OverlayView.java | 104 ++++++++++++++++-- ucrop/src/main/res/values/attrs.xml | 7 ++ 4 files changed, 126 insertions(+), 11 deletions(-) diff --git a/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java b/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java index f8cc9369e..f8c5ea911 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java @@ -257,6 +257,14 @@ public static class Options { public static final String EXTRA_CROP_GRID_COLOR = EXTRA_PREFIX + ".CropGridColor"; public static final String EXTRA_CROP_GRID_STROKE_WIDTH = EXTRA_PREFIX + ".CropGridStrokeWidth"; + public static final String EXTRA_CROP_INNER_LINE_STROKE_COLOR = EXTRA_PREFIX + ".CropInnerLineStrokeColor"; + public static final String EXTRA_CROP_INNER_LINE_STROKE_WIDTH = EXTRA_PREFIX + ".CropInnerLineStrokeWidth"; + public static final String EXTRA_CROP_INNER_DASH_ENABLE = EXTRA_PREFIX + ".CropInnerLineDashEnable"; + public static final String EXTRA_CROP_INNER_DASH_INTERVAL = EXTRA_PREFIX + ".CropInnerLineDashInterval"; + public static final String EXTRA_CROP_INNER_DASH_PHASE = EXTRA_PREFIX + ".CropInnerLineDashPhase"; + + public static final String EXTRA_CROP_CIRCULAR_PATH_PADDING = EXTRA_PREFIX + ".CropCircularPathPadding"; + public static final String EXTRA_TOOL_BAR_COLOR = EXTRA_PREFIX + ".ToolbarColor"; public static final String EXTRA_STATUS_BAR_COLOR = EXTRA_PREFIX + ".StatusBarColor"; public static final String EXTRA_UCROP_COLOR_WIDGET_ACTIVE = EXTRA_PREFIX + ".UcropColorWidgetActive"; diff --git a/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java b/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java index 5067db44b..5e19a933f 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java @@ -84,9 +84,12 @@ public class UCropActivity extends AppCompatActivity { private int mStatusBarColor; private int mActiveWidgetColor; private int mToolbarWidgetColor; - @ColorInt private int mRootViewBackgroundColor; - @DrawableRes private int mToolbarCancelDrawable; - @DrawableRes private int mToolbarCropDrawable; + @ColorInt + private int mRootViewBackgroundColor; + @DrawableRes + private int mToolbarCancelDrawable; + @DrawableRes + private int mToolbarCropDrawable; private int mLogoColor; private boolean mShowBottomControls; @@ -237,6 +240,15 @@ private void processOptions(@NonNull Intent intent) { mOverlayView.setCropGridColor(intent.getIntExtra(UCrop.Options.EXTRA_CROP_GRID_COLOR, getResources().getColor(R.color.ucrop_color_default_crop_grid))); mOverlayView.setCropGridStrokeWidth(intent.getIntExtra(UCrop.Options.EXTRA_CROP_GRID_STROKE_WIDTH, getResources().getDimensionPixelSize(R.dimen.ucrop_default_crop_grid_stoke_width))); + mOverlayView.setInnerLineStrokeColor(intent.getIntExtra(UCrop.Options.EXTRA_CROP_INNER_LINE_STROKE_COLOR, OverlayView.DEFAULT_INNER_STROKE_COLOR)); + mOverlayView.setInnerLineStrokeWidth(intent.getIntExtra(UCrop.Options.EXTRA_CROP_INNER_LINE_STROKE_WIDTH, OverlayView.DEFAULT_INNER_STROKE_WIDTH)); + mOverlayView.setInnerLineDashEnable(intent.getBooleanExtra(UCrop.Options.EXTRA_CROP_INNER_DASH_ENABLE, true)); + mOverlayView.setInnerLineDashInterval(intent.getIntExtra(UCrop.Options.EXTRA_CROP_INNER_DASH_INTERVAL, OverlayView.DEFAULT_INNER_STROKE_DASH_INTERVAL)); + mOverlayView.setInnerLineDashPhase(intent.getIntExtra(UCrop.Options.EXTRA_CROP_INNER_DASH_PHASE, OverlayView.DEFAULT_INNER_STROKE_DASH_PHASE)); + + + mOverlayView.setCircularPathPadding(intent.getIntExtra(UCrop.Options.EXTRA_CROP_CIRCULAR_PATH_PADDING, OverlayView.DEFAULT_CIRCULAR_PATH_PADDING)); + // Aspect ratio options float aspectRatioX = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_X, 0); float aspectRatioY = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_Y, 0); diff --git a/ucrop/src/main/java/com/yalantis/ucrop/view/OverlayView.java b/ucrop/src/main/java/com/yalantis/ucrop/view/OverlayView.java index 8f18d9627..38749d4e8 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/view/OverlayView.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/view/OverlayView.java @@ -3,6 +3,8 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; @@ -35,31 +37,45 @@ public class OverlayView extends View { public static final int FREESTYLE_CROP_MODE_ENABLE = 1; public static final int FREESTYLE_CROP_MODE_ENABLE_WITH_PASS_THROUGH = 2; - public static final boolean DEFAULT_SHOW_CROP_FRAME = true; - public static final boolean DEFAULT_SHOW_CROP_GRID = true; - public static final boolean DEFAULT_CIRCLE_DIMMED_LAYER = false; + public static final boolean DEFAULT_SHOW_CROP_FRAME = false; + public static final boolean DEFAULT_SHOW_CROP_GRID = false; + public static final boolean DEFAULT_CIRCLE_DIMMED_LAYER = true; public static final int DEFAULT_FREESTYLE_CROP_MODE = FREESTYLE_CROP_MODE_DISABLE; public static final int DEFAULT_CROP_GRID_ROW_COUNT = 2; public static final int DEFAULT_CROP_GRID_COLUMN_COUNT = 2; + public static final int DEFAULT_INNER_STROKE_DASH_INTERVAL = 20; + public static final int DEFAULT_INNER_STROKE_DASH_PHASE = 20; + public static final int DEFAULT_INNER_STROKE_WIDTH = 5; + public static final int DEFAULT_INNER_STROKE_COLOR = Color.parseColor("#fbd400"); + + public static final int DEFAULT_CIRCULAR_PATH_PADDING = 30; + private final RectF mCropViewRect = new RectF(); private final RectF mTempRect = new RectF(); protected int mThisWidth, mThisHeight; protected float[] mCropGridCorners; protected float[] mCropGridCenter; - + private int mCropGridRowCount, mCropGridColumnCount; private float mTargetAspectRatio; private float[] mGridPoints = null; private boolean mShowCropFrame, mShowCropGrid; private boolean mCircleDimmedLayer; private int mDimmedColor; + private int mInnerStrokeDashInterval; + private int mInnerStrokeDashPhase; + private int mInnerStokeWidth; + private int mInnerStrokeColor; + private int mCircularPathPadding; + private boolean mInnerLineDashEnable; private Path mCircularPath = new Path(); private Paint mDimmedStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint mCropGridPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint mCropFramePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint mCropFrameCornersPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint mInnerStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); @FreestyleMode private int mFreestyleCropMode = DEFAULT_FREESTYLE_CROP_MODE; private float mPreviousTouchX = -1, mPreviousTouchY = -1; @@ -184,6 +200,58 @@ public void setDimmedColor(@ColorInt int dimmedColor) { mDimmedColor = dimmedColor; } + /** + * Setter for {@link #mInnerStrokeColor} variable + * + * @param innerLineStrokeColor + */ + public void setInnerLineStrokeColor(@ColorInt int innerLineStrokeColor) { + mInnerStrokeColor = innerLineStrokeColor; + mInnerStrokePaint.setColor(innerLineStrokeColor); + } + + /** + * Setter for inner line stroke width + */ + public void setInnerLineStrokeWidth(@IntRange(from = 0) int width) { + mInnerStokeWidth = width; + mInnerStrokePaint.setStrokeWidth(width); + } + + /** + * Setter for inner line dash enable + */ + public void setInnerLineDashEnable(boolean dashEnable) { + mInnerLineDashEnable = dashEnable; + mInnerStrokePaint.setPathEffect( + new DashPathEffect(new float[]{mInnerStrokeDashInterval, mInnerStrokeDashInterval, + mInnerStrokeDashInterval, mInnerStrokeDashInterval}, mInnerStrokeDashPhase)); + } + + /** + * Setter for inner line dash interval + */ + public void setInnerLineDashInterval(@IntRange(from = 0) int interval) { + mInnerStrokeDashInterval = interval; + mInnerStrokePaint.setPathEffect( + new DashPathEffect(new float[]{interval, interval, + interval, interval}, mInnerStrokeDashPhase)); + } + + /** + * Setter for inner line dash phase + */ + public void setInnerLineDashPhase(@IntRange(from = 0) int phase) { + mInnerStrokeDashPhase = phase; + mInnerStrokePaint.setPathEffect( + new DashPathEffect(new float[]{mInnerStrokeDashInterval, mInnerStrokeDashInterval, + mInnerStrokeDashInterval, mInnerStrokeDashInterval}, phase)); + } + + public void setCircularPathPadding(@IntRange(from = 0) int circularPathPadding) { + mCircularPathPadding = circularPathPadding; + } + /** * Setter for crop frame stroke width */ @@ -258,7 +326,8 @@ private void updateGridPoints() { mGridPoints = null; mCircularPath.reset(); mCircularPath.addCircle(mCropViewRect.centerX(), mCropViewRect.centerY(), - Math.min(mCropViewRect.width(), mCropViewRect.height()) / 2.f, Path.Direction.CW); + Math.min(mCropViewRect.width(), mCropViewRect.height()) / 2.f - mCircularPathPadding + , Path.Direction.CW); } protected void init() { @@ -298,7 +367,9 @@ protected void onDraw(Canvas canvas) { @Override public boolean onTouchEvent(MotionEvent event) { - if (mCropViewRect.isEmpty() || mFreestyleCropMode == FREESTYLE_CROP_MODE_DISABLE) { return false; } + if (mCropViewRect.isEmpty() || mFreestyleCropMode == FREESTYLE_CROP_MODE_DISABLE) { + return false; + } float x = event.getX(); float y = event.getY(); @@ -454,9 +525,10 @@ protected void drawDimmedLayer(@NonNull Canvas canvas) { canvas.drawColor(mDimmedColor); canvas.restore(); - if (mCircleDimmedLayer) { // Draw 1px stroke to fix antialias + if (mCircleDimmedLayer) { // Draw inner stroke canvas.drawCircle(mCropViewRect.centerX(), mCropViewRect.centerY(), - Math.min(mCropViewRect.width(), mCropViewRect.height()) / 2.f, mDimmedStrokePaint); + Math.min(mCropViewRect.width(), mCropViewRect.height()) / 2.f + - mCircularPathPadding, mInnerStrokePaint); } } @@ -527,6 +599,22 @@ protected void processStyledAttributes(@NonNull TypedArray a) { mDimmedStrokePaint.setStyle(Paint.Style.STROKE); mDimmedStrokePaint.setStrokeWidth(1); + mInnerStrokeColor = a.getColor(R.styleable.ucrop_UCropView_ucrop_inner_line_stroke_color, DEFAULT_INNER_STROKE_COLOR); + mInnerStokeWidth = a.getDimensionPixelSize(R.styleable.ucrop_UCropView_ucrop_inner_line_stroke_width, DEFAULT_INNER_STROKE_WIDTH); + mInnerLineDashEnable = a.getBoolean(R.styleable.ucrop_UCropView_ucrop_inner_line_dash_enable, true); + mInnerStrokeDashInterval = a.getDimensionPixelOffset(R.styleable.ucrop_UCropView_ucrop_inner_line_dash_interval, DEFAULT_INNER_STROKE_DASH_INTERVAL); + mInnerStrokeDashInterval = a.getDimensionPixelOffset(R.styleable.ucrop_UCropView_ucrop_inner_line_dash_phase, DEFAULT_INNER_STROKE_DASH_PHASE); + mInnerStrokePaint.setColor(mInnerStrokeColor); + mInnerStrokePaint.setStyle(Paint.Style.STROKE); + mInnerStrokePaint.setStrokeWidth(mInnerStokeWidth); + if (mInnerLineDashEnable) { + mInnerStrokePaint.setPathEffect( + new DashPathEffect(new float[]{mInnerStrokeDashInterval, mInnerStrokeDashInterval, + mInnerStrokeDashInterval, mInnerStrokeDashInterval}, mInnerStrokeDashPhase)); + } + + mCircularPathPadding = a.getDimensionPixelOffset(R.styleable.ucrop_UCropView_ucrop_circular_path_padding, DEFAULT_CIRCULAR_PATH_PADDING); + initCropFrameStyle(a); mShowCropFrame = a.getBoolean(R.styleable.ucrop_UCropView_ucrop_show_frame, DEFAULT_SHOW_CROP_FRAME); diff --git a/ucrop/src/main/res/values/attrs.xml b/ucrop/src/main/res/values/attrs.xml index 5a3e62de8..8c6bf2c58 100644 --- a/ucrop/src/main/res/values/attrs.xml +++ b/ucrop/src/main/res/values/attrs.xml @@ -21,6 +21,13 @@ + + + + + + +