Browse Source

DASH style support WORM Slide mode.

zhpanvip 5 years ago
parent
commit
7344413d24

+ 3 - 3
app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java

@@ -154,15 +154,15 @@ public class IndicatorFragment extends BaseFragment {
                 .setIndicatorGap(getResources().getDimensionPixelOffset(R.dimen.dp_3))
                 .setPageMargin(0)
                 .setIndicatorWidth(normalWidth, checkedWidth)
-                .setIndicatorColor(Color.parseColor("#888888"),
-                        Color.parseColor("#118EEA")).create(getMDrawableList());
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .create(getMDrawableList());
     }
 
     private int getNormalWidth() {
         if (mSlideMode == IndicatorSlideMode.SMOOTH || mSlideMode == IndicatorSlideMode.WORM) {
             return getResources().getDimensionPixelOffset(R.dimen.dp_10);
         } else {
-            return getResources().getDimensionPixelOffset(R.dimen.dp_10);
+            return getResources().getDimensionPixelOffset(R.dimen.dp_4);
         }
     }
 }

+ 24 - 3
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/BaseDrawer.java

@@ -1,6 +1,7 @@
 package com.zhpan.bannerview.indicator.drawer;
 
 import android.graphics.Paint;
+import android.graphics.RectF;
 
 import com.zhpan.bannerview.manager.IndicatorOptions;
 
@@ -12,17 +13,37 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
  */
 public abstract class BaseDrawer implements IDrawer {
 
+    private MeasureResult mMeasureResult;
     IndicatorOptions mIndicatorOptions;
-
+    float maxWidth;
+    float minWidth;
     Paint mPaint;
-
-    MeasureResult mMeasureResult;
+    RectF mRectF;
 
     BaseDrawer(IndicatorOptions indicatorOptions) {
         this.mIndicatorOptions = indicatorOptions;
         mPaint = new Paint();
         mPaint.setAntiAlias(true);
         mMeasureResult = new MeasureResult();
+        mRectF = new RectF();
+    }
+
+    @Override
+    public MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        maxWidth = Math.max(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
+        minWidth = Math.min(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
+        mMeasureResult.setMeasureResult(measureWidth(), measureHeight());
+        return mMeasureResult;
+    }
+
+    protected int measureHeight() {
+        return (int) mIndicatorOptions.getSliderHeight();
+    }
+
+    private int measureWidth() {
+        int pageSize = mIndicatorOptions.getPageSize();
+        float indicatorGap = mIndicatorOptions.getIndicatorGap();
+        return (int) ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth);
     }
 
     @Override

+ 2 - 15
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/CircleDrawer.java

@@ -18,10 +18,6 @@ import static com.zhpan.bannerview.constants.IndicatorSlideMode.WORM;
  */
 public class CircleDrawer extends BaseDrawer {
 
-    private float maxWidth;
-
-    private float minWidth;
-
     CircleDrawer(IndicatorOptions indicatorOptions) {
         super(indicatorOptions);
     }
@@ -29,17 +25,8 @@ public class CircleDrawer extends BaseDrawer {
     private RectF rectF = new RectF();
 
     @Override
-    public MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        maxWidth = Math.max(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        minWidth = Math.min(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        mMeasureResult.setMeasureResult(measureWidth(), (int) maxWidth);
-        return mMeasureResult;
-    }
-
-    private int measureWidth() {
-        int pageSize = mIndicatorOptions.getPageSize();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        return (int) ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth);
+    protected int measureHeight() {
+        return (int) maxWidth;
     }
 
     @Override

+ 3 - 86
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DashDrawer.java

@@ -2,7 +2,6 @@ package com.zhpan.bannerview.indicator.drawer;
 
 import android.graphics.Canvas;
 
-import com.zhpan.bannerview.constants.IndicatorSlideMode;
 import com.zhpan.bannerview.manager.IndicatorOptions;
 
 /**
@@ -11,96 +10,14 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
  *   Description: Dash Indicator Drawer.
  * </pre>
  */
-public class DashDrawer extends BaseDrawer {
-
-    private float maxWidth;
-
-    private float minWidth;
+public class DashDrawer extends RectDrawer {
 
     DashDrawer(IndicatorOptions indicatorOptions) {
         super(indicatorOptions);
     }
 
     @Override
-    public MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        maxWidth = Math.max(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        minWidth = Math.min(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        mMeasureResult.setMeasureResult(getMeasureWidth(), (int) mIndicatorOptions.getSliderHeight());
-        return mMeasureResult;
-    }
-
-    private int getMeasureWidth() {
-        int pageSize = mIndicatorOptions.getPageSize();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        return (int) ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth);
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        drawIndicator(canvas);
-    }
-
-    private void drawIndicator(Canvas canvas) {
-        int pageSize = mIndicatorOptions.getPageSize();
-        if (pageSize > 1) {
-            for (int i = 0; i < pageSize; i++) {
-                switch (mIndicatorOptions.getSlideMode()) {
-                    case IndicatorSlideMode.NORMAL:
-                        normalSlide(canvas, i);
-                        break;
-                    case IndicatorSlideMode.SMOOTH:
-                    case IndicatorSlideMode.WORM:
-                        if (isWidthEquals()) {
-                            smoothSlide(canvas, i);
-                        } else {
-                            normalSlide(canvas, i);
-                        }
-                        break;
-                }
-            }
-        }
-    }
-
-    private void normalSlide(Canvas canvas, int i) {
-        float normalIndicatorWidth = mIndicatorOptions.getNormalIndicatorWidth();
-        int normalColor = mIndicatorOptions.getNormalColor();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        float sliderHeight = mIndicatorOptions.getSliderHeight();
-        int currentPosition = mIndicatorOptions.getCurrentPosition();
-        if (normalIndicatorWidth == mIndicatorOptions.getCheckedIndicatorWidth()) {
-            mPaint.setColor(normalColor);
-            float left = i * (normalIndicatorWidth) + i * +indicatorGap;
-            canvas.drawRect(left, 0, left + normalIndicatorWidth, sliderHeight, mPaint);
-            drawSliderStyle(canvas);
-        } else {  //  仿支付宝首页轮播图的Indicator
-            if (i < currentPosition) {
-                mPaint.setColor(normalColor);
-                float left = i * minWidth + i * indicatorGap;
-                canvas.drawRect(left, 0, left + minWidth, sliderHeight, mPaint);
-            } else if (i == currentPosition) {
-                mPaint.setColor(mIndicatorOptions.getCheckedColor());
-                float left = i * minWidth + i * indicatorGap;
-                canvas.drawRect(left, 0, left + minWidth + (maxWidth - minWidth), sliderHeight, mPaint);
-            } else {
-                mPaint.setColor(normalColor);
-                float left = i * minWidth + i * indicatorGap + (maxWidth - minWidth);
-                canvas.drawRect(left, 0, left + minWidth, sliderHeight, mPaint);
-            }
-        }
-    }
-
-    private void smoothSlide(Canvas canvas, int i) {
-        mPaint.setColor(mIndicatorOptions.getNormalColor());
-        float left = i * (maxWidth) + i * +mIndicatorOptions.getIndicatorGap() + (maxWidth - minWidth);
-        canvas.drawRect(left, 0, left + minWidth, mIndicatorOptions.getSliderHeight(), mPaint);
-        drawSliderStyle(canvas);
-    }
-
-    private void drawSliderStyle(Canvas canvas) {
-        mPaint.setColor(mIndicatorOptions.getCheckedColor());
-        int currentPosition = mIndicatorOptions.getCurrentPosition();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        float left = currentPosition * (maxWidth) + currentPosition * +indicatorGap + (maxWidth + indicatorGap) * mIndicatorOptions.getSlideProgress();
-        canvas.drawRect(left, 0, left + maxWidth, mIndicatorOptions.getSliderHeight(), mPaint);
+    protected void drawDash(Canvas canvas) {
+        canvas.drawRect(mRectF, mPaint);
     }
 }

+ 108 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RectDrawer.java

@@ -0,0 +1,108 @@
+package com.zhpan.bannerview.indicator.drawer;
+
+import android.graphics.Canvas;
+
+import com.zhpan.bannerview.constants.IndicatorSlideMode;
+import com.zhpan.bannerview.manager.IndicatorOptions;
+import com.zhpan.bannerview.utils.BannerUtils;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2020/1/17.
+ *   Description:
+ * </pre>
+ */
+public class RectDrawer extends BaseDrawer {
+
+    RectDrawer(IndicatorOptions indicatorOptions) {
+        super(indicatorOptions);
+    }
+
+    @Override
+    public void onDraw(Canvas canvas) {
+        int pageSize = mIndicatorOptions.getPageSize();
+        if (pageSize > 1) {
+            if (isWidthEquals() && mIndicatorOptions.getSlideMode() != IndicatorSlideMode.NORMAL) {
+                drawUncheckedSlider(canvas, pageSize);
+                drawCheckedSlider(canvas);
+            } else {    // 单独处理normalWidth与checkedWidth不一致的情况
+                for (int i = 0; i < pageSize; i++) {
+                    drawInequalitySlider(canvas, i);
+                }
+            }
+        }
+    }
+
+    private void drawUncheckedSlider(Canvas canvas, int pageSize) {
+        for (int i = 0; i < pageSize; i++) {
+            mPaint.setColor(mIndicatorOptions.getNormalColor());
+            float sliderHeight = mIndicatorOptions.getSliderHeight();
+            float left = i * (maxWidth) + i * +mIndicatorOptions.getIndicatorGap() + (maxWidth - minWidth);
+            mRectF.set(left, 0, left + minWidth, sliderHeight);
+            drawRoundRect(canvas, sliderHeight, sliderHeight);
+        }
+    }
+
+    private void drawInequalitySlider(Canvas canvas, int i) {
+        int normalColor = mIndicatorOptions.getNormalColor();
+        float indicatorGap = mIndicatorOptions.getIndicatorGap();
+        float sliderHeight = mIndicatorOptions.getSliderHeight();
+        int currentPosition = mIndicatorOptions.getCurrentPosition();
+        if (i < currentPosition) {
+            mPaint.setColor(normalColor);
+            float left = i * minWidth + i * indicatorGap;
+            mRectF.set(left, 0, left + minWidth, sliderHeight);
+            drawRoundRect(canvas, sliderHeight, sliderHeight);
+        } else if (i == currentPosition) {
+            mPaint.setColor(mIndicatorOptions.getCheckedColor());
+            float left = i * minWidth + i * indicatorGap;
+            mRectF.set(left, 0, left + minWidth + (maxWidth - minWidth), sliderHeight);
+            drawRoundRect(canvas, sliderHeight, sliderHeight);
+        } else {
+            mPaint.setColor(normalColor);
+            float left = i * minWidth + i * indicatorGap + (maxWidth - minWidth);
+            mRectF.set(left, 0, left + minWidth, sliderHeight);
+            drawRoundRect(canvas, sliderHeight, sliderHeight);
+        }
+    }
+
+    private void drawCheckedSlider(Canvas canvas) {
+        mPaint.setColor(mIndicatorOptions.getCheckedColor());
+        switch (mIndicatorOptions.getSlideMode()) {
+            case IndicatorSlideMode.SMOOTH:
+                drawSmoothSlider(canvas);
+                break;
+            case IndicatorSlideMode.WORM:
+                drawWormSlider(canvas);
+                break;
+        }
+    }
+
+    private void drawWormSlider(Canvas canvas) {
+        float sliderHeight = mIndicatorOptions.getSliderHeight();
+        float slideProgress = mIndicatorOptions.getSlideProgress();
+        int currentPosition = mIndicatorOptions.getCurrentPosition();
+        float distance = mIndicatorOptions.getIndicatorGap() + mIndicatorOptions.getNormalIndicatorWidth();
+        float startCoordinateX = BannerUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition);
+        float left = startCoordinateX + Math.max(distance * (slideProgress - 0.5f) * 2.0f, 0) - mIndicatorOptions.getNormalIndicatorWidth() / 2;
+        float right = startCoordinateX + Math.min((distance * slideProgress * 2), distance) + mIndicatorOptions.getNormalIndicatorWidth() / 2;
+        mRectF.set(left, 0, right, sliderHeight);
+        drawRoundRect(canvas, sliderHeight, sliderHeight);
+    }
+
+    private void drawSmoothSlider(Canvas canvas) {
+        int currentPosition = mIndicatorOptions.getCurrentPosition();
+        float indicatorGap = mIndicatorOptions.getIndicatorGap();
+        float sliderHeight = mIndicatorOptions.getSliderHeight();
+        float left = currentPosition * (maxWidth) + currentPosition * +indicatorGap + (maxWidth + indicatorGap) * mIndicatorOptions.getSlideProgress();
+        mRectF.set(left, 0, left + maxWidth, sliderHeight);
+        drawRoundRect(canvas, sliderHeight, sliderHeight);
+    }
+
+    protected void drawRoundRect(Canvas canvas, float rx, float ry) {
+        drawDash(canvas);
+    }
+
+    protected void drawDash(Canvas canvas) {
+    }
+}

+ 3 - 103
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java

@@ -1,11 +1,8 @@
 package com.zhpan.bannerview.indicator.drawer;
 
 import android.graphics.Canvas;
-import android.graphics.RectF;
 
-import com.zhpan.bannerview.constants.IndicatorSlideMode;
 import com.zhpan.bannerview.manager.IndicatorOptions;
-import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
  * <pre>
@@ -13,111 +10,14 @@ import com.zhpan.bannerview.utils.BannerUtils;
  *   Description:
  * </pre>
  */
-public class RoundRectDrawer extends BaseDrawer {
-
-    private float maxWidth;
-
-    private float minWidth;
+public class RoundRectDrawer extends RectDrawer {
 
     RoundRectDrawer(IndicatorOptions indicatorOptions) {
         super(indicatorOptions);
     }
 
     @Override
-    public MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        maxWidth = Math.max(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        minWidth = Math.min(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
-        mMeasureResult.setMeasureResult(measureWidth(), (int) mIndicatorOptions.getSliderHeight());
-        return mMeasureResult;
-    }
-
-    private int measureWidth() {
-        int pageSize = mIndicatorOptions.getPageSize();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        return (int) ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth);
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        int pageSize = mIndicatorOptions.getPageSize();
-        if (pageSize > 1) {
-            if (isWidthEquals() && mIndicatorOptions.getSlideMode() != IndicatorSlideMode.NORMAL) {
-                drawUncheckedSlider(canvas, pageSize);
-                drawCheckedSlider(canvas);
-            } else {    // 单独处理normalWidth与checkedWidth不一致的情况
-                for (int i = 0; i < pageSize; i++) {
-                    drawInequalitySlider(canvas, i);
-                }
-            }
-        }
-    }
-
-    private void drawUncheckedSlider(Canvas canvas, int pageSize) {
-        for (int i = 0; i < pageSize; i++) {
-            mPaint.setColor(mIndicatorOptions.getNormalColor());
-            float sliderHeight = mIndicatorOptions.getSliderHeight();
-            float left = i * (maxWidth) + i * +mIndicatorOptions.getIndicatorGap() + (maxWidth - minWidth);
-            RectF rectF = new RectF(left, 0, left + minWidth, sliderHeight);
-            canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-        }
-    }
-
-    private void drawInequalitySlider(Canvas canvas, int i) {
-        int normalColor = mIndicatorOptions.getNormalColor();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        float sliderHeight = mIndicatorOptions.getSliderHeight();
-        int currentPosition = mIndicatorOptions.getCurrentPosition();
-        RectF rectF;
-        if (i < currentPosition) {
-            mPaint.setColor(normalColor);
-            float left = i * minWidth + i * indicatorGap;
-            rectF = new RectF(left, 0, left + minWidth, sliderHeight);
-            canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-        } else if (i == currentPosition) {
-            mPaint.setColor(mIndicatorOptions.getCheckedColor());
-            float left = i * minWidth + i * indicatorGap;
-            rectF = new RectF(left, 0, left + minWidth + (maxWidth - minWidth), sliderHeight);
-            canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-        } else {
-            mPaint.setColor(normalColor);
-            float left = i * minWidth + i * indicatorGap + (maxWidth - minWidth);
-            rectF = new RectF(left, 0, left + minWidth, sliderHeight);
-            canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-        }
-    }
-
-    private void drawCheckedSlider(Canvas canvas) {
-        mPaint.setColor(mIndicatorOptions.getCheckedColor());
-        switch (mIndicatorOptions.getSlideMode()) {
-            case IndicatorSlideMode.SMOOTH:
-                drawSmoothSlider(canvas);
-                break;
-            case IndicatorSlideMode.WORM:
-                drawWormSlider(canvas);
-                break;
-        }
-    }
-
-    private RectF rectF = new RectF();
-
-    private void drawWormSlider(Canvas canvas) {
-        float sliderHeight = mIndicatorOptions.getSliderHeight();
-        float slideProgress = mIndicatorOptions.getSlideProgress();
-        int currentPosition = mIndicatorOptions.getCurrentPosition();
-        float distance = mIndicatorOptions.getIndicatorGap() + mIndicatorOptions.getNormalIndicatorWidth();
-        float startCoordinateX = BannerUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition);
-        float left = startCoordinateX + Math.max(distance * (slideProgress - 0.5f) * 2.0f, 0) - mIndicatorOptions.getNormalIndicatorWidth() / 2;
-        float right = startCoordinateX + Math.min((distance * slideProgress * 2), distance) + mIndicatorOptions.getNormalIndicatorWidth() / 2;
-        rectF.set(left, 0, right, sliderHeight);
-        canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-    }
-
-    private void drawSmoothSlider(Canvas canvas) {
-        int currentPosition = mIndicatorOptions.getCurrentPosition();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        float sliderHeight = mIndicatorOptions.getSliderHeight();
-        float left = currentPosition * (maxWidth) + currentPosition * +indicatorGap + (maxWidth + indicatorGap) * mIndicatorOptions.getSlideProgress();
-        RectF rectF = new RectF(left, 0, left + maxWidth, sliderHeight);
-        canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
+    protected void drawRoundRect(Canvas canvas, float rx, float ry) {
+        canvas.drawRoundRect(mRectF, rx, ry, mPaint);
     }
 }