Browse Source

Merge branch 'master' into jc_master

zhpanvip 5 years ago
parent
commit
2a8129f825
33 changed files with 471 additions and 383 deletions
  1. 10 15
      README.md
  2. 10 17
      README_CN.md
  3. BIN
      app/release/app-release.apk
  4. 2 1
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
  5. 61 27
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java
  6. 2 1
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java
  7. 6 6
      app/src/main/res/layout/activity_main.xml
  8. 1 0
      app/src/main/res/layout/fragment_find.xml
  9. 129 58
      app/src/main/res/layout/fragment_indicator.xml
  10. 1 0
      app/src/main/res/values/strings.xml
  11. 3 2
      bannerview/src/main/java/com/zhpan/bannerview/annotation/AIndicatorSlideMode.java
  12. 3 2
      bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorSlideMode.java
  13. 21 23
      bannerview/src/main/java/com/zhpan/bannerview/indicator/BaseIndicatorView.java
  14. 28 3
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/BaseDrawer.java
  15. 46 36
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/CircleDrawer.java
  16. 3 78
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DashDrawer.java
  17. 108 0
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RectDrawer.java
  18. 3 92
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java
  19. 20 20
      bannerview/src/main/java/com/zhpan/bannerview/manager/IndicatorOptions.java
  20. 13 2
      bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java
  21. 1 0
      bannerview/src/main/res/values/attrs.xml
  22. BIN
      image/slide_circle_normal.gif
  23. BIN
      image/slide_circle_smooth.gif
  24. BIN
      image/slide_circle_worm.gif
  25. BIN
      image/slide_normal.gif
  26. BIN
      image/slide_smooth.gif
  27. BIN
      image/style_circle.gif
  28. 0 0
      image/style_dash_normal.gif
  29. BIN
      image/style_dash_smooth.gif
  30. BIN
      image/style_dash_worm.gif
  31. 0 0
      image/style_round_rect_normal.gif
  32. BIN
      image/style_round_rect_smooth.gif
  33. BIN
      image/style_round_rect_worm.gif

+ 10 - 15
README.md

@@ -25,15 +25,17 @@
 |--|--|--|
 | ![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_overlay.gif) |
 
-### 2.setIndicatorStyle
+### 2.setIndicatorStyle and setIndicatorSlideMode
 
-BannerViewPager supports three Indicator Styles now. 
+BannerViewPager supports three Indicator Styles and three Indicator Slide mode now. 
 
 [Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
 
-| 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) |
+| Attrs | CIRCLE | DASH | ROUND_RECT |
+|--|--|--|--|
+| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_normal.gif) |
+| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_smooth.gif) |
+| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_worm.gif) |
 
 ### 3.Custom Indicator
 
@@ -46,14 +48,7 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 | ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom2.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom1.gif) |
 
 
-### 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) |
-
-
-### 5.setPageTransformerStyle
+### 4.setPageTransformerStyle
 
 [Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java)
 
@@ -76,7 +71,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 +105,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) |

+ 10 - 17
README_CN.md

@@ -27,14 +27,15 @@
 |--|--|--|
 | ![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_overlay.gif) |
 
-### 2.setIndicatorStyle
-BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
+### 2.setIndicatorStyle 与 setIndicatorSlideMode
 
-[IndicatorViewStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
+BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlideMode,分别如下:
 
-| 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 | DASH | ROUND_RECT |
+|--|--|--|--|
+| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_normal.gif) |
+| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_smooth.gif) |
+| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_round_rect_worm.gif) |
 
 ### 3.Custom Indicator
 
@@ -47,15 +48,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,分别如下:
 | ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom1.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom2.gif) |
 
 
-
-### 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) |
-
-
-### 5.setPageTransformerStyle
+### 4.setPageTransformerStyle
 
 [TransformStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java)
 
@@ -79,7 +72,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 +106,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) |

BIN
app/release/app-release.apk


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

@@ -137,9 +137,10 @@ public class HomeFragment extends BaseFragment {
     private void initBanner() {
         mViewPager
                 .setAutoPlay(true)
-                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setInterval(5000)
                 .setScrollDuration(1200)
+                .setIndicatorRadius(getResources().getDimensionPixelSize(R.dimen.dp_3))
                 .setIndicatorView(mIndicatorView)// 这里为了设置标题故用了自定义Indicator,如果无需标题则没必要添加此行代码
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setHolderCreator(NetViewHolder::new)

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

@@ -1,6 +1,5 @@
 package com.example.zhpan.circleviewpager.fragment;
 
-import android.graphics.Color;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.RadioButton;
@@ -9,6 +8,7 @@ import android.widget.RadioGroup;
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.annotation.AIndicatorSlideMode;
 import com.zhpan.bannerview.constants.IndicatorGravity;
 import com.zhpan.bannerview.constants.IndicatorSlideMode;
 import com.zhpan.bannerview.constants.IndicatorStyle;
@@ -21,8 +21,12 @@ import com.zhpan.idea.utils.ToastUtils;
 public class IndicatorFragment extends BaseFragment {
 
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
-    private RadioGroup radioGroupStyle;
+    private RadioGroup mRadioGroupStyle;
+    private RadioGroup mRadioGroupMode;
     private RadioButton radioButton;
+    private @AIndicatorSlideMode
+    int mSlideMode = IndicatorSlideMode.SMOOTH;
+    private int mCheckId = R.id.rb_circle;
 
     @Override
     protected int getLayout() {
@@ -53,7 +57,8 @@ public class IndicatorFragment extends BaseFragment {
     @Override
     protected void initView(Bundle savedInstanceState, View view) {
         radioButton = view.findViewById(R.id.rb_circle);
-        radioGroupStyle = view.findViewById(R.id.rg_indicator_style);
+        mRadioGroupStyle = view.findViewById(R.id.rg_indicator_style);
+        mRadioGroupMode = view.findViewById(R.id.rg_slide_mode);
         mViewPager = view.findViewById(R.id.banner_view);
         mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
                 .setRoundCorner(BannerUtils.dp2px(6))
@@ -66,68 +71,97 @@ public class IndicatorFragment extends BaseFragment {
     }
 
     private void initRadioGroup() {
-        radioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> {
+        mRadioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> checkedChange(mCheckId = checkedId));
+        radioButton.performClick();
+        mRadioGroupMode.setOnCheckedChangeListener((group, checkedId) -> {
             switch (checkedId) {
-                case R.id.rb_circle:
-                    setupCircleIndicator();
-                    break;
-                case R.id.rb_dash:
-                    setupDashIndicator();
+                case R.id.rb_normal:
+                    mSlideMode = IndicatorSlideMode.NORMAL;
                     break;
-                case R.id.rb_round_rect:
-                    setupRoundRectIndicator();
+                case R.id.rb_worm:
+                    mSlideMode = IndicatorSlideMode.WORM;
                     break;
-                case R.id.rb_tmall:
-                    setupTmallIndicator();
+                case R.id.rb_smooth:
+                    mSlideMode = IndicatorSlideMode.SMOOTH;
                     break;
             }
+            checkedChange(mCheckId);
         });
-        radioButton.performClick();
     }
 
-    private void setupTmallIndicator() {
+    private void checkedChange(int checkedId) {
+        switch (checkedId) {
+            case R.id.rb_circle:
+                setupCircleIndicator();
+                break;
+            case R.id.rb_dash:
+                setupDashIndicator();
+                break;
+            case R.id.rb_round_rect:
+                setupRoundRectIndicator();
+                break;
+            case R.id.rb_tmall:
+                setupTMallIndicator();
+                break;
+        }
+    }
+
+    private void setupTMallIndicator() {
         mViewPager
                 .setIndicatorStyle(IndicatorStyle.DASH)
                 .setIndicatorGap(0)
-                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
-                .setIndicatorColor(getColor(R.color.white_alpha_75), getColor(R.color.white))
-                .setIndicatorWidth(getResources().getDimensionPixelOffset(R.dimen.dp_12), getResources().getDimensionPixelOffset(R.dimen.dp_12))
-                .setIndicatorHeight(BannerUtils.dp2px(1.5f))
+                .setIndicatorSlideMode(mSlideMode)
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setIndicatorWidth(getResources().getDimensionPixelOffset(R.dimen.dp_15))
+                .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_3))
                 .create(getMDrawableList());
     }
 
     private void setupRoundRectIndicator() {
+        int checkedWidth = getResources().getDimensionPixelOffset(R.dimen.dp_10);
+        int normalWidth = getNormalWidth();
         mViewPager.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
                 .setIndicatorGravity(IndicatorGravity.CENTER)
                 .setIndicatorGap(BannerUtils.dp2px(4))
                 .setPageMargin(0)
-                .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
+                .setIndicatorSlideMode(mSlideMode)
                 .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_4))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
-                .setIndicatorWidth(getResources().getDimensionPixelOffset(R.dimen.dp_4), getResources().getDimensionPixelOffset(R.dimen.dp_10)).create(getMDrawableList());
+                .setIndicatorWidth(normalWidth, checkedWidth).create(getMDrawableList());
     }
 
     private void setupCircleIndicator() {
         mViewPager.setIndicatorStyle(IndicatorStyle.CIRCLE)
-                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                .setIndicatorSlideMode(mSlideMode)
                 .setIndicatorGravity(IndicatorGravity.CENTER)
                 .setIndicatorGap(getResources().getDimensionPixelOffset(R.dimen.dp_6))
+                .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_4))
                 .setPageMargin(0)
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
-                .setIndicatorRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4), getResources().getDimensionPixelOffset(R.dimen.dp_5)).create(getMDrawableList());
+                .setIndicatorRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4)).create(getMDrawableList());
     }
 
     private void setupDashIndicator() {
+        int checkedWidth = getResources().getDimensionPixelOffset(R.dimen.dp_10);
+        int normalWidth = getNormalWidth();
         mViewPager.setIndicatorStyle(IndicatorStyle.DASH)
                 .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_3))
                 .setIndicatorGravity(IndicatorGravity.CENTER)
-                .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
+                .setIndicatorSlideMode(mSlideMode)
                 .setIndicatorGap(getResources().getDimensionPixelOffset(R.dimen.dp_3))
                 .setPageMargin(0)
-                .setIndicatorWidth(getResources().getDimensionPixelOffset(R.dimen.dp_3), getResources().getDimensionPixelOffset(R.dimen.dp_10))
-                .setIndicatorColor(Color.parseColor("#888888"),
-                        Color.parseColor("#118EEA")).create(getMDrawableList());
+                .setIndicatorWidth(normalWidth, checkedWidth)
+                .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_4);
+        }
     }
 }

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

@@ -55,9 +55,10 @@ 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)
+                .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
                 .setHolderCreator(() -> new ImageResourceViewHolder(getResources().getDimensionPixelOffset(R.dimen.dp_5)))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setIndicatorRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4),getResources().getDimensionPixelOffset(R.dimen.dp_5))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setInterval(5000);
         initRadioGroup();

+ 6 - 6
app/src/main/res/layout/activity_main.xml

@@ -32,29 +32,29 @@
                 android:textColor="@drawable/text_color_selector" />
 
             <RadioButton
-                android:id="@+id/rb_find"
+                android:id="@+id/rb_add"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_gravity="bottom"
                 android:layout_weight="1"
                 android:button="@null"
-                android:drawableTop="@drawable/tab2_selector"
+                android:drawableTop="@drawable/tab3_selector"
                 android:gravity="center_horizontal|bottom"
                 android:paddingBottom="@dimen/dp_5"
-                android:text="@string/tab2"
+                android:text="@string/tab3"
                 android:textColor="@drawable/text_color_selector" />
 
             <RadioButton
-                android:id="@+id/rb_add"
+                android:id="@+id/rb_find"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_gravity="bottom"
                 android:layout_weight="1"
                 android:button="@null"
-                android:drawableTop="@drawable/tab3_selector"
+                android:drawableTop="@drawable/tab2_selector"
                 android:gravity="center_horizontal|bottom"
                 android:paddingBottom="@dimen/dp_5"
-                android:text="@string/tab3"
+                android:text="@string/tab2"
                 android:textColor="@drawable/text_color_selector" />
 
             <RadioButton

+ 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" />
 

+ 129 - 58
app/src/main/res/layout/fragment_indicator.xml

@@ -13,62 +13,133 @@
         app:bvp_indicator_visibility="visible"
         app:bvp_round_corner="@dimen/dp_8" />
 
-    <TextView
-        android:id="@+id/tv_page_style"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/dp_10"
-        android:layout_marginTop="@dimen/dp_10"
-        android:text="@string/text_indicator_style"
-        android:textColor="#000000"
-        android:textSize="@dimen/sp_18"
-        android:textStyle="bold" />
-
-    <RadioGroup
-        android:id="@+id/rg_indicator_style"
+    <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:padding="@dimen/dp_15">
-
-        <RadioButton
-            android:id="@+id/rb_circle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:layout_marginBottom="@dimen/dp_10"
-            android:text="Circle"
-            android:textSize="@dimen/sp_16" />
-
-        <RadioButton
-            android:id="@+id/rb_dash"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:layout_marginBottom="@dimen/dp_10"
-            android:text="Dash"
-            android:textSize="@dimen/sp_16" />
-
-        <RadioButton
-            android:id="@+id/rb_round_rect"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:layout_marginBottom="@dimen/dp_10"
-            android:text="ROUND_RECT"
-            android:textSize="@dimen/sp_16" />
-
-        <RadioButton
-            android:id="@+id/rb_tmall"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:layout_marginBottom="@dimen/dp_10"
-            android:text="Tmall Indicator Style"
-            android:textSize="@dimen/sp_16" />
-
-
-    </RadioGroup>
-
-
-</LinearLayout>
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_page_style"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/dp_10"
+                android:layout_marginTop="@dimen/dp_10"
+                android:text="@string/text_indicator_style"
+                android:textColor="#000000"
+                android:textSize="@dimen/sp_18"
+                android:textStyle="bold" />
+
+            <RadioGroup
+                android:id="@+id/rg_indicator_style"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:padding="@dimen/dp_15">
+
+                <RadioButton
+                    android:id="@+id/rb_circle"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Circle"
+                    android:textSize="@dimen/sp_16" />
+
+                <RadioButton
+                    android:id="@+id/rb_dash"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Dash"
+                    android:textSize="@dimen/sp_16" />
+
+                <RadioButton
+                    android:id="@+id/rb_round_rect"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="ROUND_RECT"
+                    android:textSize="@dimen/sp_16" />
+
+                <RadioButton
+                    android:id="@+id/rb_tmall"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Tmall Indicator Style"
+                    android:textSize="@dimen/sp_16" />
+
+
+            </RadioGroup>
+
+            <TextView
+                android:id="@+id/tv_slide_mode"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/dp_10"
+                android:layout_marginTop="@dimen/dp_10"
+                android:text="@string/text_slide_mode"
+                android:textColor="#000000"
+                android:textSize="@dimen/sp_18"
+                android:textStyle="bold" />
+
+            <RadioGroup
+                android:id="@+id/rg_slide_mode"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:padding="@dimen/dp_15">
+
+                <RadioButton
+                    android:id="@+id/rb_smooth"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:checked="true"
+                    android:text="SMOOTH"
+                    android:textSize="@dimen/sp_16" />
+
+                <RadioButton
+                    android:id="@+id/rb_worm"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="WORM"
+                    android:textSize="@dimen/sp_16" />
+
+
+                <RadioButton
+                    android:id="@+id/rb_normal"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="NORMAL"
+                    android:textSize="@dimen/sp_16" />
+
+                <RadioButton
+                    android:id="@+id/rb_scale"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="SCALE"
+                    android:textSize="@dimen/sp_16"
+                    android:visibility="gone" />
+
+            </RadioGroup>
+
+        </LinearLayout>
+    </androidx.core.widget.NestedScrollView>
+
+</LinearLayout>
+

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -13,4 +13,5 @@
     <string name="text_page_style">Page Style:</string>
     <string name="text_indicator_style">Indicator Style:</string>
     <string name="custom_style">Custom Style</string>
+    <string name="text_slide_mode">Indicator Slide Mode</string>
 </resources>

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

@@ -10,6 +10,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>
@@ -17,8 +18,8 @@ import static com.zhpan.bannerview.constants.IndicatorSlideMode.SMOOTH;
  *   Description:
  * </pre>
  */
-@IntDef({NORMAL, SMOOTH})
+@IntDef({NORMAL, SMOOTH,WORM})
 @Retention(RetentionPolicy.SOURCE)
-@Target(ElementType.PARAMETER)
+@Target({ElementType.PARAMETER,ElementType.FIELD})
 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;
 }

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

@@ -47,8 +47,9 @@ 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();
         }
     }
 
@@ -58,30 +59,27 @@ public class BaseIndicatorView extends View implements IIndicator {
                 if (positionOffset < 0.5) {
                     setCurrentPosition(position);
                     setSlideProgress(0);
-                    invalidate();
                 } else {
                     setCurrentPosition(0);
                     setSlideProgress(0);
-                    invalidate();
                 }
             } else {    //  中间页面
                 setCurrentPosition(position);
                 setSlideProgress(positionOffset);
-                invalidate();
             }
         }
     }
 
-    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) {
@@ -122,9 +120,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();
@@ -142,13 +140,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;

+ 28 - 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
@@ -50,4 +71,8 @@ public abstract class BaseDrawer implements IDrawer {
         }
 
     }
+
+    protected boolean isWidthEquals() {
+        return mIndicatorOptions.getNormalIndicatorWidth() == mIndicatorOptions.getCheckedIndicatorWidth();
+    }
 }

+ 46 - 36
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/CircleDrawer.java

@@ -1,11 +1,14 @@
 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>
@@ -15,63 +18,70 @@ import static com.zhpan.bannerview.constants.IndicatorSlideMode.SMOOTH;
  */
 public class CircleDrawer extends BaseDrawer {
 
-    private float maxWidth;
-
-    private float minWidth;
-
     CircleDrawer(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) maxWidth);
-        return mMeasureResult;
-    }
+    private RectF rectF = new RectF();
 
-    private int getMeasureWidth() {
-        int pageSize = mIndicatorOptions.getPageSize();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
-        return (int) ((pageSize - 1) * indicatorGap + maxWidth + (pageSize - 1) * minWidth);
+    @Override
+    protected int measureHeight() {
+        return (int) maxWidth;
     }
 
     @Override
     public void onDraw(Canvas canvas) {
-        drawIndicator(canvas);
+        if (mIndicatorOptions.getPageSize() > 1) {
+            drawNormal(canvas);
+            drawSlider(canvas);
+        }
     }
 
-    private void drawIndicator(Canvas canvas) {
-        if (mIndicatorOptions.getPageSize() > 1) {
-            float normalIndicatorWidth = mIndicatorOptions.getNormalIndicatorWidth();
-            for (int i = 0; i < mIndicatorOptions.getPageSize(); i++) {
-                mPaint.setColor(mIndicatorOptions.getNormalColor());
-                canvas.drawCircle(maxWidth / 2 + (normalIndicatorWidth + mIndicatorOptions.getIndicatorGap()) * i,
-                        maxWidth / 2f, normalIndicatorWidth / 2, mPaint);
-            }
-            drawSliderStyle(canvas);
+    private void drawNormal(Canvas canvas) {
+        float normalIndicatorWidth = mIndicatorOptions.getNormalIndicatorWidth();
+        mPaint.setColor(mIndicatorOptions.getNormalColor());
+        for (int i = 0; i < mIndicatorOptions.getPageSize(); i++) {
+            float coordinateX = BannerUtils.getCoordinateX(mIndicatorOptions, maxWidth, i);
+            float coordinateY = BannerUtils.getCoordinateY(maxWidth);
+            drawCircle(canvas, coordinateX, coordinateY, normalIndicatorWidth / 2);
         }
     }
 
-    private void drawSliderStyle(Canvas canvas) {
+    private void drawSlider(Canvas canvas) {
         mPaint.setColor(mIndicatorOptions.getCheckedColor());
-        float normalIndicatorWidth = mIndicatorOptions.getNormalIndicatorWidth();
-        float indicatorGap = mIndicatorOptions.getIndicatorGap();
         switch (mIndicatorOptions.getSlideMode()) {
             case NORMAL:
             case SMOOTH:
-                drawSmoothSlide(canvas, normalIndicatorWidth, indicatorGap);
+                drawCircleSlider(canvas);
+                break;
+            case WORM:
+                drawWormSlider(canvas, mIndicatorOptions.getNormalIndicatorWidth());
                 break;
-//            case WORM:
-//                drawWormSlider(canvas, normalIndicatorWidth, indicatorGap);
-//                break;
         }
     }
 
-    private void drawSmoothSlide(Canvas canvas, float normalIndicatorWidth, float indicatorGap) {
-        canvas.drawCircle(maxWidth / 2 + (normalIndicatorWidth + indicatorGap) * mIndicatorOptions.getCurrentPosition()
-                        + (normalIndicatorWidth + indicatorGap) * mIndicatorOptions.getSlideProgress(),
-                maxWidth / 2f, mIndicatorOptions.getCheckedIndicatorWidth() / 2, mPaint);
+    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);
     }
 }

+ 3 - 78
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,88 +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++) {
-                if (mIndicatorOptions.getSlideMode() == IndicatorSlideMode.SMOOTH) {
-                    smoothSlide(canvas, i);
-                } else {
-                    normalSlide(canvas, i);
-                }
-            }
-        }
-    }
-
-    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 - 92
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java

@@ -1,9 +1,7 @@
 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;
 
 /**
@@ -12,101 +10,14 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
  *   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(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++) {
-                if (mIndicatorOptions.getSlideMode() == IndicatorSlideMode.SMOOTH) {
-                    smoothSlide(canvas, i);
-                } else {
-                    normalSlide(canvas, i);
-                }
-            }
-        }
+    protected void drawRoundRect(Canvas canvas, float rx, float ry) {
+        canvas.drawRoundRect(mRectF, rx, ry, mPaint);
     }
-
-    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();
-        RectF rectF;
-        if (normalIndicatorWidth == mIndicatorOptions.getCheckedIndicatorWidth()) {
-            mPaint.setColor(normalColor);
-            float left = i * (normalIndicatorWidth) + i * +indicatorGap;
-            rectF = new RectF(left, 0, left + normalIndicatorWidth, sliderHeight);
-            canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-            drawSliderStyle(canvas);
-        } else {
-
-            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 smoothSlide(Canvas canvas, int 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);
-        drawSliderStyle(canvas);
-    }
-
-    private void drawSliderStyle(Canvas canvas) {
-        mPaint.setColor(mIndicatorOptions.getCheckedColor());
-        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 + minWidth, sliderHeight);
-        canvas.drawRoundRect(rectF, sliderHeight, sliderHeight, mPaint);
-//        canvas.drawRect(left, 0, left + maxWidth, mIndicatorOptions.getSliderHeight(), 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;

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

@@ -3,6 +3,8 @@ package com.zhpan.bannerview.utils;
 import android.content.res.Resources;
 import android.util.Log;
 
+import com.zhpan.bannerview.manager.IndicatorOptions;
+
 /**
  * <pre>
  *   Created by zhangpan on 2019-08-14.
@@ -26,13 +28,13 @@ public class BannerUtils {
     }
 
     public static void log(String tag, String msg) {
-        if (debugMode) {
+        if (isDebugMode()) {
             Log.e(tag, msg);
         }
     }
 
     public static void log(String msg) {
-        if (debugMode) {
+        if (isDebugMode()) {
             Log.e("BannerView", msg);
         }
     }
@@ -40,4 +42,13 @@ public class BannerUtils {
     public static int getRealPosition(boolean isCanLoop, int position, int pageSize) {
         return isCanLoop ? (position - 1 + pageSize) % pageSize : (position + pageSize) % pageSize;
     }
+
+    public static float getCoordinateX(IndicatorOptions indicatorOptions, float maxDiameter, int index) {
+        float normalIndicatorWidth = indicatorOptions.getNormalIndicatorWidth();
+        return maxDiameter / 2 + (normalIndicatorWidth + indicatorOptions.getIndicatorGap()) * index;
+    }
+
+    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_circle_normal.gif


BIN
image/slide_circle_smooth.gif


BIN
image/slide_circle_worm.gif


BIN
image/slide_normal.gif


BIN
image/slide_smooth.gif


BIN
image/style_circle.gif


+ 0 - 0
image/style_dash.gif → image/style_dash_normal.gif


BIN
image/style_dash_smooth.gif


BIN
image/style_dash_worm.gif


+ 0 - 0
image/style_round_rect.gif → image/style_round_rect_normal.gif


BIN
image/style_round_rect_smooth.gif


BIN
image/style_round_rect_worm.gif