Răsfoiți Sursa

WORM Indicator slide mode supported.

zhpanvip 5 ani în urmă
părinte
comite
eb0b0e1994

+ 6 - 6
README.md

@@ -33,7 +33,7 @@ BannerViewPager supports three Indicator Styles now.
 
 | CIRCLE | DASH | ROUND_RECT |
 |--|--|--|
-| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_circle.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect.gif) |
+| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect.gif) |
 
 ### 3.Custom Indicator
 
@@ -48,9 +48,9 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 
 ### 4.setIndicatorSlideMode
 
-| NORMAL | SMOOTH |
-|--|--|
-| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) |  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_smooth.gif) |
+| NORMAL | SMOOTH | WORM |
+|--|--|--|
+| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) |  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_smooth.gif) ||  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_worm.gif) |
 
 
 ### 5.setPageTransformerStyle
@@ -76,7 +76,7 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 | BannerViewPager<T, VH> setIndicatorStyle(int indicatorStyle) | set indicator style | enum(CIRCLE, DASH、ROUND_RECT) default CIRCLE  |
 | BannerViewPager<T, VH> setIndicatorGravity(int gravity) | set indicator gravity |enum(CENTER、START、END) default value CENTER |
 | BannerViewPager<T, VH> setIndicatorColor(int normalColor,int checkedColor) | set indicator color |normalColor:color of indicator dot not selected, default value  "#8C6C6D72", checkedColor:color of indicator selected default value is "#8C18171C" |
-| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | set indicator slide mode | enum(NORMAL、SMOOTH),default value NORMAL  |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | set indicator slide mode | enum(NORMAL;SMOOTH;WORM),default value NORMAL  |
 | BannerViewPager<T, VH> setIndicatorRadius(int radius) | set indicator dot radius | default value is 4dp|
 | BannerViewPager<T, VH> setIndicatorRadius(int normalRadius,int checkRadius)  |set indicator dot radius  |  normalRadius:normal radius of indicator dot,  checkedRadius:checked radius of indicator dot,default value is 4dp |
 | BannerViewPager<T, VH> setIndicatorWidth(int indicatorWidth) | set indicator dot width,if it's Circle indicator the parameter is diameter of circle | default value is 8dp|
@@ -110,7 +110,7 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 | bvp_page_margin | dimension | set item margin |
 | bvp_reveal_width | dimension | it's only used when the page style is MULTI_PAGE/MULTI_PAGE_SCALE/MULTI_PAGE_OVERLAP,the value is two side item reveal width |
 | bvp_indicator_style | enum | indicator style. enum(circle/dash)  |
-| bvp_indicator_slide_mode | enum | indicator slide mode.enum(normal/smooth) |
+| bvp_indicator_slide_mode | enum | indicator slide mode.enum(normal;smooth;worm) |
 | bvp_indicator_gravity | enum | indicator gravity. enum(center/start/end) |
 | bvp_page_style | enum | page style. enum(normal/multi_page/multi_page_overlap/multi_page_scale) |
 | bvp_transformer_style | enum | transform style. enum(normal/depth/stack/accordion) |

+ 6 - 6
README_CN.md

@@ -34,7 +34,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
 
 | CIRCLE | DASH | ROUND_RECT |
 |--|--|--|
-| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_circle.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect.gif) |
+| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_nomal.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect.gif) |
 
 ### 3.Custom Indicator
 
@@ -50,9 +50,9 @@ BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
 
 ### 4.setIndicatorSlideMode
 
-| NORMAL | SMOOTH |
-|--|--|
-| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) |  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_smooth.gif) |
+| NORMAL | SMOOTH | WORM |
+|--|--|--|
+| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) |  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_smooth.gif) ||  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_worm.gif) |
 
 
 ### 5.setPageTransformerStyle
@@ -79,7 +79,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
 | BannerViewPager<T, VH> setIndicatorStyle(int indicatorStyle) | 设置指示器样式 | 可选枚举(CIRCLE, DASH、ROUND_RECT) 默认CIRCLE  |
 | BannerViewPager<T, VH> setIndicatorGravity(int gravity) | 指示器位置 |可选值(CENTER、START、END)默认值CENTER |
 | BannerViewPager<T, VH> setIndicatorColor(int normalColor,int checkedColor) | 指示器圆点颜色 |normalColor:未选中时颜色默认"#8C6C6D72", checkedColor:选中时颜色 默认"#8C18171C" |
-| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH),默认值NORMAL  |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH、WORM),默认值NORMAL  |
 | BannerViewPager<T, VH> setIndicatorRadius(int radius) | 设置指示器圆点半径 | 默认值4dp|
 | BannerViewPager<T, VH> setIndicatorRadius(int normalRadius,int checkRadius)  |设置指示器圆点半径  |  normalRadius:未选中时半径  checkedRadius:选中时的半径,默认值4dp |
 | BannerViewPager<T, VH> setIndicatorWidth(int indicatorWidth) | 设置指示器宽度,如果是圆形指示器,则为直径 |  默认值8dp|
@@ -113,7 +113,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
 | bvp_page_margin | dimension | 页面item间距 |
 | bvp_reveal_width | dimension | 一屏多页模式下两边item漏出的宽度 |
 | bvp_indicator_style | enum | indicator样式(circle/dash)  |
-| bvp_indicator_slide_mode | enum | indicator滑动模式(normal/smooth) |
+| bvp_indicator_slide_mode | enum | indicator滑动模式(normal;smooth;worm) |
 | bvp_indicator_gravity | enum | indicator位置(center/start/end) |
 | bvp_page_style | enum | page样式(normal/multi_page/multi_page_overlap/multi_page_scale) |
 | bvp_transformer_style | enum | transform样式(normal/depth/stack/accordion) |

+ 2 - 1
app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java

@@ -55,7 +55,6 @@ public class PageFragment extends BaseFragment {
         mRadioGroupPageStyle = view.findViewById(R.id.rg_page_style);
         radioButton = view.findViewById(R.id.rb_multi_page);
         mViewPager
-                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
                 .setHolderCreator(() -> new ImageResourceViewHolder(getResources().getDimensionPixelOffset(R.dimen.dp_5)))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
@@ -91,6 +90,7 @@ public class PageFragment extends BaseFragment {
 
     private void setupBanner(@APageStyle int pageStyle) {
         mViewPager
+                .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setPageMargin(getResources().getDimensionPixelOffset(R.dimen.dp_10))
                 .setRevealWidth(getResources().getDimensionPixelOffset(R.dimen.dp_10))
                 .setPageStyle(pageStyle)
@@ -100,6 +100,7 @@ public class PageFragment extends BaseFragment {
     //  仿QQ音乐的Banner
     private void setNetEaseMusicStyle() {
         mViewPager
+                .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
                 .setPageMargin(getResources().getDimensionPixelOffset(R.dimen.dp_15))
                 .setRevealWidth(BannerUtils.dp2px(0))
                 .setPageStyle(PageStyle.MULTI_PAGE)

+ 1 - 0
app/src/main/res/layout/fragment_find.xml

@@ -8,6 +8,7 @@
         android:id="@+id/banner_view"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dp_180"
+        app:bvp_indicator_slide_mode="worm"
         android:layout_marginTop="@dimen/dp_20"
         app:bvp_page_style="multi_page" />
 

+ 2 - 1
bannerview/src/main/java/com/zhpan/bannerview/annotation/AIndicatorSlideMode.java

@@ -9,6 +9,7 @@ import java.lang.annotation.Target;
 
 import static com.zhpan.bannerview.constants.IndicatorSlideMode.NORMAL;
 import static com.zhpan.bannerview.constants.IndicatorSlideMode.SMOOTH;
+import static com.zhpan.bannerview.constants.IndicatorSlideMode.WORM;
 
 /**
  * <pre>
@@ -16,7 +17,7 @@ import static com.zhpan.bannerview.constants.IndicatorSlideMode.SMOOTH;
  *   Description:
  * </pre>
  */
-@IntDef({NORMAL, SMOOTH})
+@IntDef({NORMAL, SMOOTH,WORM})
 @Retention(RetentionPolicy.SOURCE)
 @Target(ElementType.PARAMETER)
 public @interface AIndicatorSlideMode {

+ 3 - 2
bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorSlideMode.java

@@ -8,6 +8,7 @@ package com.zhpan.bannerview.constants;
  */
 public interface IndicatorSlideMode {
     int NORMAL = 0;
-    int SMOOTH = 1 << 1;
-//    int WORM = 3;
+    int SMOOTH = 2;
+    int WORM = 3;
+//    int THIN_WORM = 4;
 }

+ 20 - 20
bannerview/src/main/java/com/zhpan/bannerview/indicator/BaseIndicatorView.java

@@ -48,7 +48,7 @@ public class BaseIndicatorView extends View implements IIndicator {
 
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        if (getSlideMode() == IndicatorSlideMode.SMOOTH && getPageSize() > 1) {
+        if (getSlideMode() != IndicatorSlideMode.NORMAL && getPageSize() > 1) {
             scrollSlider(position, positionOffset);
             invalidate();
         }
@@ -71,16 +71,16 @@ public class BaseIndicatorView extends View implements IIndicator {
         }
     }
 
-    private boolean isSlideToRight(int position, float positionOffset) {
-        int prePosition = mIndicatorOptions.getPrePosition();
-        if ((prePosition == 0 && position == getPageSize() - 1)) {
-            return false;
-        } else if (prePosition == getPageSize() - 1 && position == 0) {
-            return true;
-        } else {
-            return (position + positionOffset - prePosition) > 0;
-        }
-    }
+//    private boolean isSlideToRight(int position, float positionOffset) {
+//        int prePosition = mIndicatorOptions.getPrePosition();
+//        if ((prePosition == 0 && position == getPageSize() - 1)) {
+//            return false;
+//        } else if (prePosition == getPageSize() - 1 && position == 0) {
+//            return true;
+//        } else {
+//            return (position + positionOffset - prePosition) > 0;
+//        }
+//    }
 
     @Override
     public void setPageSize(int pageSize) {
@@ -121,9 +121,9 @@ public class BaseIndicatorView extends View implements IIndicator {
         mIndicatorOptions = indicatorOptions;
     }
 
-    public boolean isSlideToRight() {
-        return mIndicatorOptions.isSlideToRight();
-    }
+//    public boolean isSlideToRight() {
+//        return mIndicatorOptions.isSlideToRight();
+//    }
 
     public int getSlideMode() {
         return mIndicatorOptions.getSlideMode();
@@ -141,13 +141,13 @@ public class BaseIndicatorView extends View implements IIndicator {
         mIndicatorOptions.setSlideProgress(slideProgress);
     }
 
-    private void setPrePosition(int prePosition) {
-        mIndicatorOptions.setPrePosition(prePosition);
-    }
+//    private void setPrePosition(int prePosition) {
+//        mIndicatorOptions.setPrePosition(prePosition);
+//    }
 
-    private void setSlideToRight(boolean slideToRight) {
-        mIndicatorOptions.setSlideToRight(slideToRight);
-    }
+//    private void setSlideToRight(boolean slideToRight) {
+//        mIndicatorOptions.setSlideToRight(slideToRight);
+//    }
 
     public IndicatorOptions getIndicatorOptions() {
         return mIndicatorOptions;

+ 40 - 7
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/CircleDrawer.java

@@ -1,10 +1,15 @@
 package com.zhpan.bannerview.indicator.drawer;
 
 import android.graphics.Canvas;
+import android.graphics.RectF;
 
 import com.zhpan.bannerview.manager.IndicatorOptions;
 import com.zhpan.bannerview.utils.BannerUtils;
 
+import static com.zhpan.bannerview.constants.IndicatorSlideMode.NORMAL;
+import static com.zhpan.bannerview.constants.IndicatorSlideMode.SMOOTH;
+import static com.zhpan.bannerview.constants.IndicatorSlideMode.WORM;
+
 /**
  * <pre>
  *   Created by zhpan on 2019/11/23.
@@ -21,6 +26,8 @@ public class CircleDrawer extends BaseDrawer {
         super(indicatorOptions);
     }
 
+    private RectF rectF = new RectF();
+
     @Override
     public MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         maxWidth = Math.max(mIndicatorOptions.getNormalIndicatorWidth(), mIndicatorOptions.getCheckedIndicatorWidth());
@@ -39,7 +46,7 @@ public class CircleDrawer extends BaseDrawer {
     public void onDraw(Canvas canvas) {
         if (mIndicatorOptions.getPageSize() > 1) {
             drawableNormalCircle(canvas);
-            drawSelectedCircle(canvas);
+            drawSlider(canvas);
         }
     }
 
@@ -53,17 +60,43 @@ public class CircleDrawer extends BaseDrawer {
         }
     }
 
-    private void drawSelectedCircle(Canvas canvas) {
+    private void drawSlider(Canvas canvas) {
         mPaint.setColor(mIndicatorOptions.getCheckedColor());
-        float normalIndicatorWidth = mIndicatorOptions.getNormalIndicatorWidth();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        float coordinateX = maxWidth / 2 + (normalIndicatorWidth + indicatorGap) * mIndicatorOptions.getCurrentPosition()
-                + (normalIndicatorWidth + indicatorGap) * mIndicatorOptions.getSlideProgress();
-        float coordinateY = maxWidth / 2f;
+        switch (mIndicatorOptions.getSlideMode()) {
+            case NORMAL:
+            case SMOOTH:
+                drawCircleSlider(canvas);
+                break;
+            case WORM:
+                drawWormSlider(canvas, mIndicatorOptions.getSliderHeight() * 2);
+                break;
+//            case THIN_WORM:
+//                drawWormSlider(canvas, mIndicatorOptions.getSliderHeight());
+//                break;
+        }
+    }
+
+    private void drawCircleSlider(Canvas canvas) {
+        int currentPosition = mIndicatorOptions.getCurrentPosition();
+        float startCoordinateX = BannerUtils.getCoordinateX(mIndicatorOptions, maxWidth, currentPosition);
+        float endCoordinateX = BannerUtils.getCoordinateX(mIndicatorOptions, maxWidth, (currentPosition + 1) % mIndicatorOptions.getPageSize());
+        float coordinateX = startCoordinateX + (endCoordinateX - startCoordinateX) * mIndicatorOptions.getSlideProgress();
+        float coordinateY = BannerUtils.getCoordinateY(maxWidth);
         float radius = mIndicatorOptions.getCheckedIndicatorWidth() / 2;
         drawCircle(canvas, coordinateX, coordinateY, radius);
     }
 
+    private void drawWormSlider(Canvas canvas, float sliderHeight) {
+        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 drawCircle(Canvas canvas, float coordinateX, float coordinateY, float radius) {
         canvas.drawCircle(coordinateX, coordinateY, radius, mPaint);
     }

+ 20 - 20
bannerview/src/main/java/com/zhpan/bannerview/manager/IndicatorOptions.java

@@ -48,14 +48,14 @@ public class IndicatorOptions {
      * 指示器当前位置
      */
     private int currentPosition;
-    /**
-     * 指示器上一个位置
-     */
-    private int prePosition;
-    /**
-     * 是否是向右滑动,true向右,false向左
-     */
-    private boolean slideToRight;
+//    /**
+//     * 指示器上一个位置
+//     */
+//    private int prePosition;
+//    /**
+//     * 是否是向右滑动,true向右,false向左
+//     */
+//    private boolean slideToRight;
 
     private float sliderHeight;
 
@@ -119,21 +119,21 @@ public class IndicatorOptions {
         this.currentPosition = currentPosition;
     }
 
-    public int getPrePosition() {
-        return prePosition;
-    }
+//    public int getPrePosition() {
+//        return prePosition;
+//    }
 
-    public void setPrePosition(int prePosition) {
-        this.prePosition = prePosition;
-    }
+//    public void setPrePosition(int prePosition) {
+//        this.prePosition = prePosition;
+//    }
 
-    public boolean isSlideToRight() {
-        return slideToRight;
-    }
+//    public boolean isSlideToRight() {
+//        return slideToRight;
+//    }
 
-    public void setSlideToRight(boolean slideToRight) {
-        this.slideToRight = slideToRight;
-    }
+//    public void setSlideToRight(boolean slideToRight) {
+//        this.slideToRight = slideToRight;
+//    }
 
     public int getSlideMode() {
         return slideMode;

+ 2 - 2
bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java

@@ -48,7 +48,7 @@ public class BannerUtils {
         return maxDiameter / 2 + (normalIndicatorWidth + indicatorOptions.getIndicatorGap()) * index;
     }
 
-    public static float getCoordinateY(float height) {
-        return height / 2;
+    public static float getCoordinateY(float maxDiameter) {
+        return maxDiameter / 2;
     }
 }

+ 1 - 0
bannerview/src/main/res/values/attrs.xml

@@ -22,6 +22,7 @@
         <attr name="bvp_indicator_slide_mode" format="enum">
             <enum name="normal" value="0" />
             <enum name="smooth" value="2" />
+            <enum name="worm" value="3" />
         </attr>
         <attr name="bvp_indicator_gravity" format="enum">
             <enum name="center" value="0" />

BIN
image/slide_normal.gif


BIN
image/slide_smooth.gif


BIN
image/slide_worm.gif


BIN
image/style_circle.gif