Skip to content

Commit 257cda0

Browse files
author
ly-zengxianz
committed
feat:尖角支持边框
1 parent 688ac27 commit 257cda0

3 files changed

Lines changed: 71 additions & 6 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ startBgColor   | color   | 渐变初始颜色(渐变时必选)
6363
middleBgColor   | color   | 渐变中间颜色(渐变时可选)
6464
endBgColor   | color   | 渐变结束颜色(渐变时必选)
6565

66-
渐变颜色只和border只有在sharpSize为0时(没有尖角)有效
66+
渐变颜色只有在sharpSize为0时(没有尖角)有效
6767

6868
## Usage
6969

app/src/main/res/layout/activity_main.xml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,14 @@
6565
android:paddingTop="5dp"
6666
android:paddingLeft="10dp"
6767
android:layout_marginTop="50dp"
68-
app:radius="5dp"
69-
app:arrowDirection="right"
70-
app:backgroundColor="#f0000000"
71-
app:relativePosition="100%"
72-
app:sharpSize="10dp"
68+
android:padding="35dp"
69+
app:radius="10dp"
70+
app:border="2dp"
71+
app:borderColor="#FF0000"
72+
app:arrowDirection="left"
73+
app:backgroundColor="#ff000000"
74+
app:relativePosition="50%"
75+
app:sharpSize="15dp"
7376

7477
>
7578

sharpview/src/main/java/com/zhaoxing/view/sharpview/SharpDrawable.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.graphics.drawable.Drawable;
1313
import android.graphics.drawable.GradientDrawable;
1414
import android.graphics.drawable.ShapeDrawable;
15+
import android.os.Build;
1516
import android.support.annotation.ColorInt;
1617
import android.util.Log;
1718

@@ -84,6 +85,8 @@ void setPaint(Paint paint) {
8485

8586
private PointF[] mPointFs;
8687

88+
private RectF mOvalRect[] = new RectF[4];
89+
8790
SharpDrawable() {
8891
super();
8992
init();
@@ -98,8 +101,14 @@ private void init() {
98101
mPointFs[0] = new PointF();
99102
mPointFs[1] = new PointF();
100103
mPointFs[2] = new PointF();
104+
105+
mOvalRect[0] = new RectF();
106+
mOvalRect[1] = new RectF();
107+
mOvalRect[2] = new RectF();
108+
mOvalRect[3] = new RectF();
101109
}
102110

111+
103112
@Override
104113
public void draw(Canvas canvas) {
105114
if (mSharpSize == 0) {
@@ -157,6 +166,59 @@ public void draw(Canvas canvas) {
157166
mPath.lineTo(mPointFs[0].x, mPointFs[0].y);
158167
mPaint.setColor(mBgColor);
159168
canvas.drawPath(mPath, mPaint);
169+
170+
171+
172+
mPaint.setColor(mBorderColor);
173+
mPaint.setStyle(Paint.Style.STROKE);
174+
mPaint.setStrokeWidth(mBorder);
175+
switch (mArrowDirection) {
176+
case LEFT:
177+
canvas.drawLine(mRect.left + mCornerRadius,mRect.top,mRect.right - mCornerRadius,mRect.top,mPaint);
178+
canvas.drawLine(mRect.left + mCornerRadius,mRect.bottom,mRect.right - mCornerRadius,mRect.bottom,mPaint);
179+
canvas.drawLine(mRect.right,mRect.top + mCornerRadius,mRect.right,mRect.bottom - mCornerRadius,mPaint);
180+
canvas.drawLine(mRect.left,mRect.top + mCornerRadius,mRect.left,mPointFs[1].y,mPaint);
181+
canvas.drawLine(mRect.left,mPointFs[2].y,mRect.left,mRect.bottom - mCornerRadius,mPaint);
182+
break;
183+
case TOP:
184+
canvas.drawLine(mRect.left + mCornerRadius,mRect.bottom,mRect.right - mCornerRadius,mRect.bottom,mPaint);
185+
canvas.drawLine(mRect.left,mRect.top + mCornerRadius,mRect.left,mRect.bottom - mCornerRadius,mPaint);
186+
canvas.drawLine(mRect.right,mRect.top + mCornerRadius,mRect.right,mRect.bottom - mCornerRadius,mPaint);
187+
canvas.drawLine(mRect.left + mCornerRadius,mRect.top,mPointFs[1].x,mRect.top,mPaint);
188+
canvas.drawLine(mPointFs[2].x, mRect.top, mRect.right - mCornerRadius, mRect.top, mPaint);
189+
break;
190+
case RIGHT:
191+
canvas.drawLine(mRect.left + mCornerRadius,mRect.top,mRect.right - mCornerRadius,mRect.top,mPaint);
192+
canvas.drawLine(mRect.left + mCornerRadius,mRect.bottom,mRect.right - mCornerRadius,mRect.bottom,mPaint);
193+
canvas.drawLine(mRect.left,mRect.top + mCornerRadius,mRect.left,mRect.bottom - mCornerRadius,mPaint);
194+
canvas.drawLine(mRect.right,mRect.top + mCornerRadius,mRect.right,mPointFs[1].y,mPaint);
195+
canvas.drawLine(mRect.right,mPointFs[2].y,mRect.right,mRect.bottom - mCornerRadius,mPaint);
196+
break;
197+
case BOTTOM:
198+
canvas.drawLine(mRect.left + mCornerRadius,mRect.top,mRect.right - mCornerRadius,mRect.top,mPaint);
199+
canvas.drawLine(mRect.left,mRect.top + mCornerRadius,mRect.left,mRect.bottom - mCornerRadius,mPaint);
200+
canvas.drawLine(mRect.right,mRect.top + mCornerRadius,mRect.right,mRect.bottom - mCornerRadius,mPaint);
201+
canvas.drawLine(mRect.left + mCornerRadius,mRect.bottom,mPointFs[1].x,mRect.bottom,mPaint);
202+
canvas.drawLine(mPointFs[2].x, mRect.bottom, mRect.right - mCornerRadius, mRect.bottom, mPaint);
203+
break;
204+
}
205+
206+
if (mCornerRadius > 0) {
207+
float d = 2 * mCornerRadius;
208+
209+
mOvalRect[0].set(mRect.left,mRect.top,mRect.left + d,mRect.top + d);
210+
mOvalRect[1].set(mRect.right - d,mRect.top,mRect.right,mRect.top + d);
211+
mOvalRect[2].set(mRect.left,mRect.bottom - d,mRect.left + d,mRect.bottom);
212+
mOvalRect[3].set(mRect.right - d,mRect.bottom - d,mRect.right,mRect.bottom);
213+
canvas.drawArc(mOvalRect[0],180,90,false,mPaint);
214+
canvas.drawArc(mOvalRect[1],-90,90,false,mPaint);
215+
canvas.drawArc(mOvalRect[2],90,90,false,mPaint);
216+
canvas.drawArc(mOvalRect[3],90,-90,false,mPaint);
217+
}
218+
219+
canvas.drawLine(mPointFs[0].x, mPointFs[0].y, mPointFs[1].x, mPointFs[1].y, mPaint);
220+
canvas.drawLine(mPointFs[0].x, mPointFs[0].y, mPointFs[2].x, mPointFs[2].y, mPaint);
221+
160222
}
161223
}
162224

0 commit comments

Comments
 (0)