From bbe707643ab4d500451a8ae60a1caa5176b42962 Mon Sep 17 00:00:00 2001 From: beigirad Date: Tue, 15 May 2018 00:50:36 +0430 Subject: [PATCH 1/2] ignore api < 19 to draw shadow because in api 17 has some buges in renderScript and I should use gradle processing that increase apk size, but I ignore it. --- library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java b/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java index 5540e12..c92cb26 100644 --- a/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java +++ b/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java @@ -115,7 +115,7 @@ protected void onDraw(Canvas canvas) { drawZigzag(); - if (zigzagElevation > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (zigzagElevation > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { drawShadow(); canvas.drawBitmap(shadow, 0, 0, null); } @@ -161,7 +161,7 @@ private void drawZigzag() { } } - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) + @RequiresApi(api = Build.VERSION_CODES.KITKAT) private void drawShadow() { shadow = Bitmap.createBitmap(getWidth(), getHeight(), ALPHA_8); shadow.eraseColor(TRANSPARENT); From 71fe278913b4ce334bb4b241273c11f874b9f996 Mon Sep 17 00:00:00 2001 From: beigirad Date: Tue, 15 May 2018 11:02:16 +0430 Subject: [PATCH 2/2] added TopZigzag --- .../ir/beigirad/zigzagview/ZigzagView.java | 89 +++++++++++++------ library/src/main/res/values/attrs.xml | 4 + sample/src/main/res/layout/activity_main.xml | 1 + 3 files changed, 68 insertions(+), 26 deletions(-) diff --git a/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java b/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java index c92cb26..527c859 100644 --- a/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java +++ b/library/src/main/java/ir/beigirad/zigzagview/ZigzagView.java @@ -27,6 +27,9 @@ import static android.graphics.PorterDuff.Mode.SRC_IN; public class ZigzagView extends FrameLayout { + private static final int ZIGZAG_TOP = 1; + private static final int ZIGZAG_BOTTOM = 2; // default to be backward compatible.Like google ;) + private final String TAG = this.getClass().getSimpleName(); private int zigzagHeight; private int zigzagElevation; @@ -37,6 +40,7 @@ public class ZigzagView extends FrameLayout { private int zigzagPaddingRight; private int zigzagPaddingTop; private int zigzagPaddingBottom; + private int zigzagSides; private Path pathZigzag = new Path(); private Paint paintZigzag; @@ -82,6 +86,7 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def this.zigzagPaddingRight = (int) a.getDimension(R.styleable.ZigzagView_zigzagPaddingRight, zigzagPadding); this.zigzagPaddingTop = (int) a.getDimension(R.styleable.ZigzagView_zigzagPaddingTop, zigzagPadding); this.zigzagPaddingBottom = (int) a.getDimension(R.styleable.ZigzagView_zigzagPaddingBottom, zigzagPadding); + this.zigzagSides = a.getInt(R.styleable.ZigzagView_zigzagSides, ZIGZAG_BOTTOM); a.recycle(); this.paintZigzag = new Paint(); @@ -105,7 +110,10 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { rectMain.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); rectZigzag.set(rectMain.left + zigzagPaddingLeft, rectMain.top + zigzagPaddingTop, rectMain.right - zigzagPaddingRight, rectMain.bottom - zigzagPaddingBottom); - rectContent.set(rectZigzag.left + zigzagPaddingContent, rectZigzag.top + zigzagPaddingContent, rectZigzag.right - zigzagPaddingContent, rectZigzag.bottom - zigzagPaddingContent - zigzagHeight); + rectContent.set(rectZigzag.left + zigzagPaddingContent, + rectZigzag.top + zigzagPaddingContent + (containsSide(zigzagSides, ZIGZAG_TOP) ? zigzagHeight : 0), + rectZigzag.right - zigzagPaddingContent, + rectZigzag.bottom - zigzagPaddingContent - (containsSide(zigzagSides, ZIGZAG_BOTTOM) ? zigzagHeight : 0)); super.setPadding(rectContent.left, rectContent.top, rectMain.right - rectContent.right, rectMain.bottom - rectContent.bottom); } @@ -128,37 +136,21 @@ private void drawZigzag() { float right = rectZigzag.right; float top = rectZigzag.top; float bottom = rectZigzag.bottom; - int width = (int) (right - left); pathZigzag.moveTo(right, bottom); pathZigzag.lineTo(right, top); - pathZigzag.lineTo(left, top); - pathZigzag.lineTo(left, bottom); - - int h = zigzagHeight; - int seed = 2 * h; - int count = width / seed; - int diff = width - (seed * count); - int sideDiff = diff / 2; - - float x = (float) (seed / 2); - float upHeight = bottom - h; - float downHeight = bottom; + if (containsSide(zigzagSides, ZIGZAG_TOP)) + drawHorizontalSide(pathZigzag, left, top, right, true); + else + pathZigzag.lineTo(top, left); - for (int i = 0; i < count; i++) { - int startSeed = (i * seed) + sideDiff + (int) left; - int endSeed = startSeed + seed; - - if (i == 0) { - startSeed = (int) left + sideDiff; - } else if (i == count - 1) { - endSeed = endSeed + sideDiff; - } + pathZigzag.lineTo(left, bottom); - this.pathZigzag.lineTo(startSeed + x, upHeight); - this.pathZigzag.lineTo(endSeed, downHeight); - } + if (containsSide(zigzagSides, ZIGZAG_BOTTOM)) + drawHorizontalSide(pathZigzag, left, bottom, right, false); + else + pathZigzag.lineTo(right, bottom); } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @@ -181,4 +173,49 @@ private void drawShadow() { } + private void drawHorizontalSide(Path path, float left, float y, float right, boolean isTop) { + int h = zigzagHeight; + int seed = 2 * h; + int width = (int) (right - left); + int count = width / seed; + int diff = width - (seed * count); + int sideDiff = diff / 2; + + float halfSeed = (float) (seed / 2); + float innerHeight = isTop ? y + h : y - h; + + if (isTop) { + for (int i = count; i > 0; i--) { + int startSeed = (i * seed) + sideDiff + (int) left; + int endSeed = startSeed - seed; + + if (i == 1) { + endSeed = endSeed - sideDiff; + } + + path.lineTo(startSeed - halfSeed, innerHeight); + path.lineTo(endSeed, y); + } + } else { + for (int i = 0; i < count; i++) { + int startSeed = (i * seed) + sideDiff + (int) left; + int endSeed = startSeed + seed; + + if (i == 0) { + startSeed = (int) left + sideDiff; + } else if (i == count - 1) { + endSeed = endSeed + sideDiff; + } + + path.lineTo(startSeed + halfSeed, innerHeight); + path.lineTo(endSeed, y); + } + } + + + } + + private boolean containsSide(int flagSet, int flag) { + return (flagSet | flag) == flagSet; + } } \ No newline at end of file diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index d9641a2..b656045 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -10,5 +10,9 @@ + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index c3c9156..dfddb65 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -13,6 +13,7 @@ app:zigzagBackgroundColor="#8bc34a" app:zigzagElevation="8dp" app:zigzagHeight="10dp" + app:zigzagSides="top|bottom" app:zigzagPaddingContent="16dp">