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
8 changes: 8 additions & 0 deletions ucrop/src/main/java/com/yalantis/ucrop/UCrop.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
18 changes: 15 additions & 3 deletions ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
104 changes: 96 additions & 8 deletions ucrop/src/main/java/com/yalantis/ucrop/view/OverlayView.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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);

Expand Down
7 changes: 7 additions & 0 deletions ucrop/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@
<attr name="ucrop_frame_color" format="color"/>
<attr name="ucrop_show_frame" format="boolean"/>

<attr name="ucrop_inner_line_stroke_width" format="dimension"/>
<attr name="ucrop_inner_line_stroke_color" format="color"/>
<attr name="ucrop_inner_line_dash_enable" format="boolean"/>
<attr name="ucrop_inner_line_dash_interval" format="dimension"/>
<attr name="ucrop_inner_line_dash_phase" format="dimension"/>

<attr name="ucrop_circular_path_padding" format="dimension"/>
</declare-styleable>

<declare-styleable name="ucrop_AspectRatioTextView">
Expand Down