Skip to content

Commit

Permalink
update readMe
Browse files Browse the repository at this point in the history
  • Loading branch information
dongjunkun committed Sep 20, 2016
1 parent c3d7278 commit deedcee
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
最近项目中刚好需要做优惠券效果,其他的都不难,关键在一个半圆锯齿和虚线边框的绘制,当然可以使用png图片作为背景来实现,这样很简单,但这样做会拉低整个App的档次,效果不好,修改也麻烦,之前看过网上有人用代码实现了这个效果,看了下原理,但始终用起来问题比较多,使用不灵活,自己就稍微总结了下,整理一个可以简单自定义效果的库,可以先看看效果图


![preview.png](http://upload-images.jianshu.io/upload_images/697635-9cf7828e44a55e4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![preview.png](/art/couponView.png)


我自己遇到的场景是第三种,上面是锯齿,其他三侧均为虚线,当然,还有更多的可以自定义选项,稍后介绍。
Expand Down
Binary file modified art/couponView.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
42 changes: 37 additions & 5 deletions library/src/main/java/yyydjk/com/library/CouponView.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,38 +119,70 @@ public boolean isRightSemicircle() {
}

public void setRightSemicircle(boolean rightSemicircle) {
helper.setRightSemicircle(rightSemicircle);
helper.setRightSemicircle(rightSemicircle);
}

public boolean isTopDashLine() {
return helper.isTopDashLine();
}

public void setTopDashLine(boolean topDashLine) {
helper.setTopDashLine(topDashLine);
helper.setTopDashLine(topDashLine);
}

public boolean isBottomDashLine() {
return helper.isBottomDashLine();
}

public void setBottomDashLine(boolean bottomDashLine) {
helper.setBottomDashLine(bottomDashLine);
helper.setBottomDashLine(bottomDashLine);
}

public boolean isLeftDashLine() {
return helper.isLeftDashLine();
}

public void setLeftDashLine(boolean leftDashLine) {
helper.setLeftDashLine(leftDashLine);
helper.setLeftDashLine(leftDashLine);
}

public boolean isRightDashLine() {
return helper.isRightDashLine();
}

public void setRightDashLine(boolean rightDashLine) {
helper.setRightDashLine(rightDashLine);
helper.setRightDashLine(rightDashLine);
}

public float getTopDashLineMargin() {
return helper.getTopDashLineMargin();
}

public void setTopDashLineMargin(float topDashLineMargin) {
helper.setTopDashLineMargin(topDashLineMargin);
}

public float getBottomDashLineMargin() {
return helper.getBottomDashLineMargin();
}

public void setBottomDashLineMargin(float bottomDashLineMargin) {
helper.setBottomDashLineMargin(bottomDashLineMargin);
}

public float getLeftDashLineMargin() {
return helper.getLeftDashLineMargin();
}

public void setLeftDashLineMargin(float leftDashLineMargin) {
helper.setLeftDashLineMargin(leftDashLineMargin);
}

public float getRightDashLineMargin() {
return helper.getRightDashLineMargin();
}

public void setRightDashLineMargin(float rightDashLineMargin) {
helper.setRightDashLineMargin(rightDashLineMargin);
}
}
121 changes: 95 additions & 26 deletions library/src/main/java/yyydjk/com/library/CouponViewHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class CouponViewHelper {
private static final int DEFAULT_DASH_LINE_HEIGHT = 1;
private static final int DEFAULT_DASH_LINE_GAP = 5;
private static final int DEFAULT_DASH_LINE_COLOR = 0xFFFFFFFF;
private static final int DEFAULT_DASH_LINE_MARGIN = 10;

private Context context;

Expand Down Expand Up @@ -100,22 +101,38 @@ public class CouponViewHelper {
//开启左边虚线
private boolean isRightDashLine = true;

//view宽度
private int viewWidth;

//view的高度
private int viewHeight;

//顶部虚线距离View顶部的距离
private float topDashLineMargin = DEFAULT_DASH_LINE_MARGIN;

//底部虚线距离View底部的距离
private float bottomDashLineMargin = DEFAULT_DASH_LINE_MARGIN;

//左侧虚线距离View左侧的距离
private float leftDashLineMargin = DEFAULT_DASH_LINE_MARGIN;

//右侧虚线距离View右侧的距离
private float rightDashLineMargin = DEFAULT_DASH_LINE_MARGIN;


public CouponViewHelper(View view, Context context, AttributeSet attrs, int defStyle) {
this.context = context;
this.view = view;
TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.CouponView, defStyle, 0);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CouponView, defStyle, 0);
semicircleRadius = a.getDimensionPixelSize(R.styleable.CouponView_cv_semicircle_radius, dp2Px(DEFAULT_SEMICIRCLE_RADIUS));
semicircleGap = a.getDimensionPixelSize(R.styleable.CouponView_cv_semicircle_gap, dp2Px(DEFAULT_SEMICIRCLE_GAP));
semicircleColor = a.getColor(R.styleable.CouponView_cv_semicircle_color, DEFAULT_SEMICIRCLE_COLOR);

dashLineGap = a.getDimensionPixelSize(R.styleable.CouponView_cv_dash_line_gap, dp2Px(DEFAULT_DASH_LINE_GAP));
dashLineHeight = a.getDimensionPixelSize(R.styleable.CouponView_cv_dash_line_height, dp2Px(DEFAULT_DASH_LINE_HEIGHT));
dashLineLength = a.getDimensionPixelSize(R.styleable.CouponView_cv_dash_line_length, dp2Px(DEFAULT_DASH_LINE_LENGTH));
dashLineColor = a.getColor(R.styleable.CouponView_cv_dash_line_color, DEFAULT_DASH_LINE_COLOR);

isTopSemicircle = a.getBoolean(R.styleable.CouponView_cv_is_top_semicircle, isTopSemicircle);
isBottomSemicircle = a.getBoolean(R.styleable.CouponView_cv_is_bottom_semicircle, isBottomSemicircle);
isLeftSemicircle = a.getBoolean(R.styleable.CouponView_cv_is_left_semicircle, isLeftSemicircle);
Expand All @@ -125,6 +142,11 @@ public CouponViewHelper(View view, Context context, AttributeSet attrs, int defS
isLeftDashLine = a.getBoolean(R.styleable.CouponView_cv_is_left_dash_line, isLeftDashLine);
isRightDashLine = a.getBoolean(R.styleable.CouponView_cv_is_right_dash_line, isRightDashLine);

topDashLineMargin = a.getDimensionPixelSize(R.styleable.CouponView_cv_top_dash_line_margin, dp2Px(DEFAULT_DASH_LINE_MARGIN));
bottomDashLineMargin = a.getDimensionPixelSize(R.styleable.CouponView_cv_bottom_dash_line_margin, dp2Px(DEFAULT_DASH_LINE_MARGIN));
leftDashLineMargin = a.getDimensionPixelSize(R.styleable.CouponView_cv_left_dash_line_margin, dp2Px(DEFAULT_DASH_LINE_MARGIN));
rightDashLineMargin = a.getDimensionPixelSize(R.styleable.CouponView_cv_right_dash_line_margin, dp2Px(DEFAULT_DASH_LINE_MARGIN));

a.recycle();
init();

Expand All @@ -149,24 +171,24 @@ public void onSizeChanged(int w, int h) {
}

private void calculate() {
if (isTopSemicircle && remindSemicircleX == 0 || isBottomSemicircle && remindSemicircleX == 0) {
if (isTopSemicircle || isBottomSemicircle) {
remindSemicircleX = (int) ((viewWidth - semicircleGap) % (2 * semicircleRadius + semicircleGap));
semicircleNumX = (int) ((viewWidth - semicircleGap) / (2 * semicircleRadius + semicircleGap));
}

if (isLeftSemicircle && remindSemicircleY == 0 || isRightSemicircle && remindSemicircleY == 0) {
if (isLeftSemicircle || isRightSemicircle) {
remindSemicircleY = (int) ((viewHeight - semicircleGap) % (2 * semicircleRadius + semicircleGap));
semicircleNumY = (int) ((viewHeight - semicircleGap) / (2 * semicircleRadius + semicircleGap));
}

if (isTopDashLine && remindDashLineX == 0 || isBottomDashLine && remindDashLineX == 0) {
remindDashLineX = (int) ((viewWidth + dashLineGap - view.getPaddingLeft() - view.getPaddingRight()) % (dashLineLength + dashLineGap));
dashLineNumX = (int) ((viewWidth + dashLineGap - view.getPaddingLeft() - view.getPaddingRight()) / (dashLineLength + dashLineGap));
if (isTopDashLine || isBottomDashLine && remindDashLineX == 0) {
remindDashLineX = (int) ((viewWidth + dashLineGap - leftDashLineMargin - rightDashLineMargin) % (dashLineLength + dashLineGap));
dashLineNumX = (int) ((viewWidth + dashLineGap - leftDashLineMargin - rightDashLineMargin) / (dashLineLength + dashLineGap));
}

if (isLeftDashLine && remindDashLineY == 0 || isRightDashLine && remindDashLineY == 0) {
remindDashLineY = (int) ((viewHeight + dashLineGap - view.getPaddingTop() - view.getPaddingBottom()) % (dashLineLength + dashLineGap));
dashLineNumY = (int) ((viewHeight + dashLineGap - view.getPaddingTop() - view.getPaddingBottom()) / (dashLineLength + dashLineGap));
if (isLeftDashLine || isRightDashLine) {
remindDashLineY = (int) ((viewHeight + dashLineGap - topDashLineMargin - bottomDashLineMargin) % (dashLineLength + dashLineGap));
dashLineNumY = (int) ((viewHeight + dashLineGap - topDashLineMargin - bottomDashLineMargin) / (dashLineLength + dashLineGap));
}
}

Expand All @@ -179,7 +201,7 @@ public void onDraw(Canvas canvas) {
if (isBottomSemicircle)
for (int i = 0; i < semicircleNumX; i++) {
float x = semicircleGap + semicircleRadius + remindSemicircleX / 2 + (semicircleGap + semicircleRadius * 2) * i;
canvas.drawCircle(x, view.getHeight(), semicircleRadius, semicirclePaint);
canvas.drawCircle(x, viewHeight, semicircleRadius, semicirclePaint);
}
if (isLeftSemicircle)
for (int i = 0; i < semicircleNumY; i++) {
Expand All @@ -189,27 +211,27 @@ public void onDraw(Canvas canvas) {
if (isRightSemicircle)
for (int i = 0; i < semicircleNumY; i++) {
float y = semicircleGap + semicircleRadius + remindSemicircleY / 2 + (semicircleGap + semicircleRadius * 2) * i;
canvas.drawCircle(view.getWidth(), y, semicircleRadius, semicirclePaint);
canvas.drawCircle(viewWidth, y, semicircleRadius, semicirclePaint);
}
if (isTopDashLine)
for (int i = 0; i < dashLineNumX; i++) {
float x = view.getPaddingLeft() + remindDashLineX / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(x, view.getPaddingTop(), x + dashLineLength, view.getPaddingTop() + dashLineHeight, dashLinePaint);
float x = leftDashLineMargin + remindDashLineX / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(x, topDashLineMargin, x + dashLineLength, topDashLineMargin + dashLineHeight, dashLinePaint);
}
if (isBottomDashLine)
for (int i = 0; i < dashLineNumX; i++) {
float x = view.getPaddingLeft() + remindDashLineX / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(x, view.getHeight() - dashLineHeight - view.getPaddingBottom(), x + dashLineLength, view.getHeight() - view.getPaddingBottom(), dashLinePaint);
float x = leftDashLineMargin + remindDashLineX / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(x, viewHeight - dashLineHeight - bottomDashLineMargin, x + dashLineLength, viewHeight - bottomDashLineMargin, dashLinePaint);
}
if (isLeftDashLine)
for (int i = 0; i < dashLineNumY; i++) {
float y = view.getPaddingTop() + remindDashLineY / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(view.getPaddingLeft(), y, view.getPaddingLeft() + dashLineHeight, y + dashLineLength, dashLinePaint);
float y = topDashLineMargin + remindDashLineY / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(leftDashLineMargin, y, leftDashLineMargin + dashLineHeight, y + dashLineLength, dashLinePaint);
}
if (isRightDashLine)
for (int i = 0; i < dashLineNumY; i++) {
float y = view.getPaddingTop() + remindDashLineY / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(view.getWidth() - view.getPaddingRight() - dashLineHeight, y, view.getWidth() - view.getPaddingRight(), y + dashLineLength, dashLinePaint);
float y = topDashLineMargin + remindDashLineY / 2 + (dashLineGap + dashLineLength) * i;
canvas.drawRect(viewWidth - rightDashLineMargin - dashLineHeight, y, viewWidth - rightDashLineMargin, y + dashLineLength, dashLinePaint);
}
}

Expand All @@ -222,7 +244,7 @@ private int px2Dp(float px) {
}

public float getSemicircleGap() {
return semicircleGap;
return px2Dp(semicircleGap);
}

public void setSemicircleGap(float semicircleGap) {
Expand All @@ -234,7 +256,7 @@ public void setSemicircleGap(float semicircleGap) {
}

public float getSemicircleRadius() {
return semicircleRadius;
return px2Dp(semicircleRadius);
}

public void setSemicircleRadius(float semicircleRadius) {
Expand All @@ -258,20 +280,19 @@ public void setSemicircleColor(int semicircleColor) {
}

public float getDashLineLength() {
return dashLineLength;
return px2Dp(dashLineLength);
}

public void setDashLineLength(float dashLineLength) {
if (this.dashLineLength != dashLineLength) {
this.dashLineLength = dashLineLength;
calculate();
calculate();
view.invalidate();
}
}

public float getDashLineHeight() {
return dashLineHeight;
return px2Dp(dashLineHeight);
}

public void setDashLineHeight(float dashLineHeight) {
Expand All @@ -283,7 +304,7 @@ public void setDashLineHeight(float dashLineHeight) {
}

public float getDashLineGap() {
return dashLineGap;
return px2Dp(dashLineGap);
}

public void setDashLineGap(float dashLineGap) {
Expand Down Expand Up @@ -401,4 +422,52 @@ public void setRightDashLine(boolean rightDashLine) {
view.invalidate();
}
}

public float getTopDashLineMargin() {
return px2Dp(topDashLineMargin);
}

public void setTopDashLineMargin(float topDashLineMargin) {
if (this.topDashLineMargin != topDashLineMargin) {
this.topDashLineMargin = topDashLineMargin;
calculate();
view.invalidate();
}
}

public float getBottomDashLineMargin() {
return px2Dp(bottomDashLineMargin);
}

public void setBottomDashLineMargin(float bottomDashLineMargin) {
if (this.bottomDashLineMargin != bottomDashLineMargin) {
this.bottomDashLineMargin = bottomDashLineMargin;
calculate();
view.invalidate();
}
}

public float getLeftDashLineMargin() {
return px2Dp(leftDashLineMargin);
}

public void setLeftDashLineMargin(float leftDashLineMargin) {
if (this.leftDashLineMargin != leftDashLineMargin) {
this.leftDashLineMargin = leftDashLineMargin;
calculate();
view.invalidate();
}
}

public float getRightDashLineMargin() {
return px2Dp(rightDashLineMargin);
}

public void setRightDashLineMargin(float rightDashLineMargin) {
if (this.rightDashLineMargin != rightDashLineMargin) {
this.rightDashLineMargin = rightDashLineMargin;
calculate();
view.invalidate();
}
}
}
4 changes: 4 additions & 0 deletions library/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@
<attr name="cv_is_bottom_dash_line" format="boolean|reference"/>
<attr name="cv_is_left_dash_line" format="boolean|reference"/>
<attr name="cv_is_right_dash_line" format="boolean|reference"/>
<attr name="cv_top_dash_line_margin" format="dimension|reference"/>
<attr name="cv_bottom_dash_line_margin" format="dimension|reference"/>
<attr name="cv_left_dash_line_margin" format="dimension|reference"/>
<attr name="cv_right_dash_line_margin" format="dimension|reference"/>
</declare-styleable>
</resources>

0 comments on commit deedcee

Please sign in to comment.