Browse Source

v2.5.2 (#52)

* Add ROUND_RECT Indicator Style.

* Fix issue #48

* Fix bug
zhpanvip 5 years ago
parent
commit
8b2a86833c
31 changed files with 472 additions and 175 deletions
  1. 15 11
      README.md
  2. 2 0
      app/build.gradle
  3. 4 1
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.kt
  4. 2 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.kt
  5. 7 8
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.kt
  6. 15 36
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java
  7. 137 0
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java
  8. 9 37
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java
  9. 12 10
      app/src/main/java/com/example/zhpan/circleviewpager/view/FigureIndicatorView.java
  10. BIN
      app/src/main/res/drawable-xhdpi/mine_hover.png
  11. BIN
      app/src/main/res/drawable-xhdpi/mine_none.png
  12. 6 0
      app/src/main/res/drawable-xhdpi/tab4_selector.xml
  13. 13 0
      app/src/main/res/layout/activity_main.xml
  14. 4 19
      app/src/main/res/layout/fragment_find.xml
  15. 64 0
      app/src/main/res/layout/fragment_indicator.xml
  16. 34 14
      app/src/main/res/layout/fragment_others.xml
  17. 4 0
      app/src/main/res/values/strings.xml
  18. 1 1
      bannerview/build.gradle
  19. 10 12
      bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
  20. 1 0
      bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorStyle.java
  21. 2 1
      bannerview/src/main/java/com/zhpan/bannerview/indicator/IndicatorView.java
  22. 5 1
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerFactory.java
  23. 107 0
      bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java
  24. 0 1
      bannerview/src/main/java/com/zhpan/bannerview/manager/AttributeController.java
  25. 0 10
      bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java
  26. 6 2
      bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java
  27. 11 10
      bannerview/src/main/res/values/attrs.xml
  28. 1 1
      build.gradle
  29. BIN
      download/app.apk
  30. BIN
      image/qq_group.png
  31. BIN
      image/style_round_rect.gif

+ 15 - 11
README.md

@@ -4,7 +4,7 @@
 [![MinSdk](https://img.shields.io/badge/API-16%2B-brightgreen.svg?style=flat)
 [![JitPack](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
 [ ![JCenter](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
-
+[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-BannerViewPager-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7961)
 
 > 腾讯视频、QQ音乐、酷狗音乐、支付宝、天猫、淘宝、优酷视频、喜马拉雅、网易云音乐、哔哩哔哩、全民K歌等App的Banner样式都可以通过BannerViewPager实现哦!
 
@@ -29,9 +29,9 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 
 [IndicatorViewStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
 
-| CIRCLE | DASH | Custom |
+| 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_custum.gif) |
+| ![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) |
 
 ### 3.setIndicatorSlideMode
 
@@ -57,12 +57,12 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 | BannerViewPager<T, VH> setCanLoop(boolean canLoop) | 是否开启循环 | 默认值true|
 | BannerViewPager<T, VH> setAutoPlay(boolean autoPlay) | 是否开启自动轮播 | 默认值true|
 | BannerViewPager<T, VH> setInterval(int interval) | 自动轮播时间间隔 |单位毫秒,默认值3000  |
-| BannerViewPager<T, VH> setScrollDuration(int scrollDuration) | 设置页面滚动时间 | 设置页面滚动时间 |单位毫秒,默认值800  |
+| BannerViewPager<T, VH> setScrollDuration(int scrollDuration) | 设置页面滚动时间 | 设置页面滚动时间 |单位毫秒,默认值500  |
 | BannerViewPager<T, VH> setRoundCorner(int radius) | 设置圆角 |默认无圆角 需要SDK_INT>=LOLLIPOP(API 21)  |
 | BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener onPageClickListener) | 设置页面点击事件 |  |
 | BannerViewPager<T, VH> setHolderCreator(HolderCreator\<VH> holderCreator) |设置HolderCreator  |必须设置HolderCreator,否则会抛出NullPointerException|
-| BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) | indicator vibility |默认值VISIBLE 2.4.2 新增|
-| BannerViewPager<T, VH> setIndicatorStyle(int indicatorStyle) | 设置指示器样式 | 可选枚举(CIRCLE, DASH) 默认CIRCLE  |
+| BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) | indicator visibility |默认值VISIBLE 2.4.2 新增|
+| 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  |
@@ -76,12 +76,12 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 | BannerViewPager<T, VH> setPageTransformerStyle(int style) | 设置页面Transformer内置样式 |  |
 | BannerViewPager<T, VH> setCurrentItem(int item) | Set the currently selected page. | 2.3.5新增 |
 | int getCurrentItem() | 获取当前position | 2.3.5新增 |
-| BannerViewPager<T, VH> setPageStyle(PageStyle pageStyle) | 设置页面样式 | 2.4.0新增 可选(MULTI_PAGE、NORMAL)MULTI_PAGE:一屏多页样式 |
+| BannerViewPager<T, VH> setPageStyle(PageStyle pageStyle) | 设置页面样式 | 2.4.0新增 可选(MULTI_PAGE、MULTI_PAGE_SCALE、MULTI_PAGE_OVERLAP)|
 | BannerViewPager<T, VH> setPageMargin(int pageMargin) | 设置页面间隔 | 2.4.0新增 |
 | BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) | 设置Indicator边距 | 2.4.1新增 |
 | BannerViewPager<T, VH> setOnPageChangeListener(OnPageChangeListener l) | 页面改变的监听事件 | 2.4.3新增 |
 | void startLoop() |开启自动轮播 | 初始化BannerViewPager时不必调用该方法,设置setAutoPlay后会调用startLoop() |
-| void stopLoop() | 停止自动轮播 | 如果开启自动轮播,为避免内存泄漏需要在onStop()或onDestroy中调用此方法 |
+| void stopLoop() | 停止自动轮播 | |
 | List\<T> getList() | 获取Banner中的集合数据 |  |
 | void create(List<T> list) |初始化并构造BannerViewPager  |必须调用,否则前面设置的参数无效  |
 
@@ -111,7 +111,7 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 ### 1.gradle中添加依赖
    
 
-如果您已迁移到AndroidX(2.5.1版本minSdkVersion支持到19),请在项目的root build.gradle中添加如下配置:
+如果您已迁移到AndroidX,请在项目的root build.gradle中添加如下配置:
 ```
 allprojects {
 		repositories {
@@ -130,7 +130,7 @@ implementation 'com.github.zhpanvip:BannerViewPager:latestVersion'
 
 Androidx latestVersion:[![latestVersion](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
 
-如果未迁移到AndroidX请使用(2.5.1版本minSdkVersion支持到16):
+如果未迁移到AndroidX请使用(非Androidx的包托管在JCenter上):
 ```
 implementation 'com.zhpan.library:bannerview:latestVersion'
 ```
@@ -289,7 +289,11 @@ Java示例:
 
 ### 7.高级功能---自定义IndicatorView
 
-在内置Indicator不满足需求时可以通过自定义IndicatorView实现。
+在内置Indicator不满足需求时可以通过自定义IndicatorView实现,例子将实现一个如下图所示的IndicatorView。
+
+| Custom IndicatorView|
+|--|
+| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) |
 
 **(1)自定义View并继承BaseIndicatorView**
 

+ 2 - 0
app/build.gradle

@@ -40,6 +40,7 @@ repositories {
 dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
     androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
         exclude group: 'com.android.support', module: 'support-annotations'
     })
@@ -55,4 +56,5 @@ dependencies {
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-2'
     implementation project(path: ':ideahttp')
     implementation 'androidx.core:core-ktx:1.1.0'
+    implementation 'androidx.cardview:cardview:1.0.0'
 }

+ 4 - 1
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.kt

@@ -27,7 +27,7 @@ class MainActivity : AppCompatActivity() {
         val mAdapter = AdapterFragmentPager(supportFragmentManager)
         vp_fragment?.adapter = mAdapter
         vp_fragment?.disableTouchScroll(true)
-        vp_fragment?.offscreenPageLimit = 2
+        vp_fragment?.offscreenPageLimit = 3
         vp_fragment?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
 
@@ -49,6 +49,7 @@ class MainActivity : AppCompatActivity() {
             0 -> checkedId = R.id.rb_home
             1 -> checkedId = R.id.rb_find
             2 -> checkedId = R.id.rb_add
+            3 -> checkedId = R.id.rb_others
         }
         return checkedId
     }
@@ -62,6 +63,8 @@ class MainActivity : AppCompatActivity() {
                 vp_fragment?.setCurrentItem(AdapterFragmentPager.PAGE_FIND, false)
 
             } else if (checkedId == R.id.rb_add) {
+                vp_fragment?.setCurrentItem(AdapterFragmentPager.PAGE_INDICATOR, false)
+            } else if (checkedId == R.id.rb_others) {
                 vp_fragment?.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, false)
             }
         }

+ 2 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.kt

@@ -49,6 +49,7 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
         setContentView(R.layout.activity_welcome)
         setupViewPager()
         updateUI(0)
+        mViewPager.create(data)
     }
 
     private fun setupViewPager() {
@@ -65,6 +66,7 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
                 .setIndicatorRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
                 .setOnPageChangeListener(object : OnPageChangeListenerAdapter() {
                     override fun onPageSelected(position: Int) {
+                        BannerUtils.e("position:$position")
                         updateUI(position)
                     }
                 })

+ 7 - 8
app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.kt

@@ -5,12 +5,7 @@ import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
 import androidx.fragment.app.FragmentPagerAdapter
-
-
-import com.example.zhpan.circleviewpager.fragment.BaseFragment
-import com.example.zhpan.circleviewpager.fragment.IndicatorFragment
-import com.example.zhpan.circleviewpager.fragment.PageFragment
-import com.example.zhpan.circleviewpager.fragment.HomeFragment
+import com.example.zhpan.circleviewpager.fragment.*
 
 class AdapterFragmentPager(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
@@ -21,7 +16,8 @@ class AdapterFragmentPager(fm: FragmentManager) : FragmentPagerAdapter(fm) {
             val fragmentList = SparseArray<BaseFragment>()
             fragmentList.put(PAGE_HOME, HomeFragment.getInstance())
             fragmentList.put(PAGE_FIND, PageFragment.getInstance())
-            fragmentList.put(PAGE_OTHERS, IndicatorFragment.getInstance())
+            fragmentList.put(PAGE_INDICATOR, IndicatorFragment.getInstance())
+            fragmentList.put(PAGE_OTHERS, OthersFragment.getInstance())
             return fragmentList
         }
 
@@ -49,7 +45,10 @@ class AdapterFragmentPager(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
         const val PAGE_FIND = 1
 
-        const val PAGE_OTHERS = 2
+        const val PAGE_INDICATOR = 2
+
+        const val PAGE_OTHERS = 3
+
     }
 
 }

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

@@ -1,6 +1,5 @@
 package com.example.zhpan.circleviewpager.fragment;
 
-import android.content.Intent;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.view.View;
@@ -8,8 +7,6 @@ import android.widget.RadioButton;
 import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
-import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.constants.IndicatorGravity;
@@ -20,7 +17,7 @@ import com.zhpan.idea.utils.ToastUtils;
 /**
  * Created by zhpan on 2018/7/24.
  */
-public class IndicatorFragment extends BaseFragment implements View.OnClickListener {
+public class IndicatorFragment extends BaseFragment {
 
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     private RadioGroup radioGroupStyle;
@@ -28,7 +25,7 @@ public class IndicatorFragment extends BaseFragment implements View.OnClickListe
 
     @Override
     protected int getLayout() {
-        return R.layout.fragment_others;
+        return R.layout.fragment_indicator;
     }
 
     @Override
@@ -41,7 +38,6 @@ public class IndicatorFragment extends BaseFragment implements View.OnClickListe
         radioButton = view.findViewById(R.id.rb_circle);
         radioGroupStyle = view.findViewById(R.id.rg_indicator_style);
         mViewPager = view.findViewById(R.id.banner_view);
-        view.findViewById(R.id.tv_photo_view).setOnClickListener(this);
         mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
                 .setRoundCorner(BannerUtils.dp2px(6))
                 .setHolderCreator(() -> new ImageResourceViewHolder(0));
@@ -53,26 +49,33 @@ public class IndicatorFragment extends BaseFragment implements View.OnClickListe
     }
 
     private void initRadioGroup() {
-        radioGroupStyle.setVisibility(View.VISIBLE);
-        radioGroupStyle.setVisibility(View.VISIBLE);
         radioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> {
             switch (checkedId) {
                 case R.id.rb_circle:
-//                    mViewPager.resetIndicator();
                     setupCircleIndicator();
                     break;
                 case R.id.rb_dash:
-//                    mViewPager.resetIndicator();
                     setupDashIndicator();
                     break;
-                case R.id.rb_custom:
-                    setupCustomIndicator();
+                case R.id.rb_round_rect:
+                    setupRoundRectIndicator();
                     break;
             }
         });
         radioButton.performClick();
     }
 
+    private void setupRoundRectIndicator() {
+        mViewPager.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
+                .setIndicatorGravity(IndicatorGravity.CENTER)
+                .setIndicatorGap(BannerUtils.dp2px(4))
+                .setPageMargin(0)
+                .setIndicatorHeight(BannerUtils.dp2px(4f))
+                .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setIndicatorWidth(BannerUtils.dp2px(4), BannerUtils.dp2px(10)).create(getMDrawableList());
+    }
+
     private void setupCircleIndicator() {
         mViewPager.setIndicatorStyle(IndicatorStyle.CIRCLE)
                 .setIndicatorGravity(IndicatorGravity.CENTER)
@@ -93,28 +96,4 @@ public class IndicatorFragment extends BaseFragment implements View.OnClickListe
                 .setIndicatorColor(Color.parseColor("#888888"),
                         Color.parseColor("#118EEA")).create(getMDrawableList());
     }
-
-    private void setupCustomIndicator() {
-        mViewPager.setAutoPlay(false).setCanLoop(true)
-                .setPageMargin(BannerUtils.dp2px(20))
-                .setIndicatorGravity(IndicatorGravity.END)
-                .setIndicatorView(setupIndicatorView())
-                .setHolderCreator(() -> new ImageResourceViewHolder(0)).create(getMDrawableList());
-    }
-
-    /**
-     * 这里可以是自定义的Indicator,需要继承BaseIndicatorView或者实现IIndicator接口;
-     */
-    private FigureIndicatorView setupIndicatorView() {
-        FigureIndicatorView indicatorView = new FigureIndicatorView(getMContext());
-        indicatorView.setRadius(BannerUtils.dp2px(18));
-        indicatorView.setTextSize(BannerUtils.dp2px(13));
-        indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
-        return indicatorView;
-    }
-
-    @Override
-    public void onClick(View view) {
-        startActivity(new Intent(getActivity(), PhotoViewActivity.class));
-    }
 }

+ 137 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java

@@ -0,0 +1,137 @@
+package com.example.zhpan.circleviewpager.fragment;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
+import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.constants.IndicatorGravity;
+import com.zhpan.bannerview.indicator.IIndicator;
+import com.zhpan.bannerview.indicator.IndicatorView;
+import com.zhpan.bannerview.utils.BannerUtils;
+import com.zhpan.idea.utils.ToastUtils;
+
+import java.lang.reflect.Field;
+import java.util.Random;
+
+
+/**
+ * Created by zhpan on 2018/7/24.
+ */
+public class OthersFragment extends BaseFragment implements View.OnClickListener {
+
+    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    private RadioGroup radioGroupStyle;
+    private RadioButton radioButton;
+    private IndicatorView mIndicatorView;
+
+    @Override
+    protected int getLayout() {
+        return R.layout.fragment_others;
+    }
+
+    @Override
+    protected void initTitle() {
+
+    }
+
+    @Override
+    protected void initView(Bundle savedInstanceState, View view) {
+        radioButton = view.findViewById(R.id.rb_indicator_below);
+        radioGroupStyle = view.findViewById(R.id.rg_indicator_style);
+        mViewPager = view.findViewById(R.id.banner_view);
+        mIndicatorView = view.findViewById(R.id.indicator_view);
+        view.findViewById(R.id.tv_photo_view).setOnClickListener(this);
+        view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
+        mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
+                .setRoundCorner(BannerUtils.dp2px(6))
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setHolderCreator(() -> new ImageResourceViewHolder(0));
+        initRadioGroup();
+    }
+
+    public static OthersFragment getInstance() {
+        return new OthersFragment();
+    }
+
+    private void initRadioGroup() {
+        radioGroupStyle.setVisibility(View.VISIBLE);
+        radioGroupStyle.setVisibility(View.VISIBLE);
+        radioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> {
+            switch (checkedId) {
+                case R.id.rb_indicator_below:
+                    resetBannerViewPager();
+                    setIndicatorBelowOfBanner();
+                    break;
+                case R.id.rb_dash:
+                    resetBannerViewPager();
+                    setupCustomIndicator();
+                    break;
+            }
+        });
+        radioButton.performClick();
+    }
+
+
+    private void setIndicatorBelowOfBanner() {
+        mIndicatorView.setVisibility(View.VISIBLE);
+        mViewPager
+                .setIndicatorVisibility(View.GONE)
+                .setIndicatorView(mIndicatorView)
+                .create(getMDrawableList());
+    }
+
+
+    private void setupCustomIndicator() {
+        mIndicatorView.setVisibility(View.INVISIBLE);
+        mViewPager.setAutoPlay(false).setCanLoop(true)
+                .setIndicatorVisibility(View.VISIBLE)
+                .setPageMargin(BannerUtils.dp2px(20))
+                .setIndicatorGravity(IndicatorGravity.END)
+                .setIndicatorView(setupIndicatorView())
+                .setHolderCreator(() -> new ImageResourceViewHolder(0)).create(getMDrawableList());
+    }
+
+    /**
+     * 这里可以是自定义的Indicator,需要继承BaseIndicatorView或者实现IIndicator接口;
+     */
+    private IIndicator setupIndicatorView() {
+        FigureIndicatorView indicatorView = new FigureIndicatorView(getMContext());
+        indicatorView.setRadius(BannerUtils.dp2px(18));
+        indicatorView.setTextSize(BannerUtils.dp2px(13));
+        indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
+        return indicatorView;
+    }
+
+    private void updateData() {
+        //  生成[-1,3]整数
+        initData(new Random().nextInt(5) - 1);
+        ToastUtils.show("size=" + getMDrawableList().size());
+        mViewPager.create(getMDrawableList());
+    }
+
+    @Override
+    public void onClick(View view) {
+        startActivity(new Intent(getActivity(), PhotoViewActivity.class));
+    }
+
+    private void resetBannerViewPager() {
+        try {
+            Field mIndicatorView = BannerViewPager.class.getDeclaredField("mIndicatorView");
+            mIndicatorView.setAccessible(true);
+            mIndicatorView.set(mViewPager, null);
+            Field isCustomIndicator = BannerViewPager.class.getDeclaredField("isCustomIndicator");
+            isCustomIndicator.setAccessible(true);
+            isCustomIndicator.set(mViewPager, false);
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 9 - 37
app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java

@@ -10,12 +10,9 @@ import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.annotation.APageStyle;
 import com.zhpan.bannerview.constants.PageStyle;
-import com.zhpan.bannerview.indicator.IndicatorView;
 import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.idea.utils.ToastUtils;
 
-import java.util.Random;
-
 /**
  * Created by zhpan on 2018/7/24.
  */
@@ -23,7 +20,6 @@ public class PageFragment extends BaseFragment {
 
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     private RadioGroup mRadioGroupPageStyle;
-    private IndicatorView indicatorView;
     private RadioButton radioButton;
 
     @Override
@@ -40,58 +36,34 @@ public class PageFragment extends BaseFragment {
     protected void initView(Bundle savedInstanceState, View view) {
         mViewPager = view.findViewById(R.id.banner_view);
         mRadioGroupPageStyle = view.findViewById(R.id.rg_page_style);
-        indicatorView = view.findViewById(R.id.indicator_view);
         radioButton = view.findViewById(R.id.rb_multi_page);
         mViewPager
-                .setPageMargin(BannerUtils.dp2px(10))
-                .setRevealWidth(BannerUtils.dp2px(10))
                 .setHolderCreator(() -> new ImageResourceViewHolder(BannerUtils.dp2px(5)))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setInterval(5000);
         initRadioGroup();
-
-        view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
     }
 
-    private void updateData() {
-        //  生成[-1,3]整数
-        initData(new Random().nextInt(5) - 1);
-        ToastUtils.show("size=" + getMDrawableList().size());
-        mViewPager.create(getMDrawableList());
-    }
 
     public static PageFragment getInstance() {
         return new PageFragment();
     }
 
-    private void setupBanner(@APageStyle int pageStyle) {
-        mViewPager
-                .setIndicatorVisibility(View.VISIBLE) // 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
-                .setPageStyle(pageStyle)
-                .create(getMDrawableList());
-    }
 
     private void initRadioGroup() {
         mRadioGroupPageStyle.setOnCheckedChangeListener((group, checkedId) -> {
             switch (checkedId) {
                 case R.id.rb_multi_page:
-//                    mViewPager.resetIndicator();// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
-                    indicatorView.setVisibility(View.INVISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
                     setupBanner(PageStyle.MULTI_PAGE);
                     break;
                 case R.id.rb_multi_page_scale:
-//                    mViewPager.resetIndicator();// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
-                    indicatorView.setVisibility(View.INVISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
                     setupBanner(PageStyle.MULTI_PAGE_SCALE);
                     break;
                 case R.id.rb_multi_page_overlap:
-                    indicatorView.setVisibility(View.VISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
-//                    mViewPager.resetIndicator();
-                    setupOverlapBanner();
+                    setupBanner(PageStyle.MULTI_PAGE_OVERLAP);
                     break;
-                case R.id.rb_multi_page_wy:
-                    indicatorView.setVisibility(View.INVISIBLE);
+                case R.id.rb_qq_music_style:
                     setNetEaseMusicStyle();
                     break;
             }
@@ -99,19 +71,19 @@ public class PageFragment extends BaseFragment {
         radioButton.performClick();
     }
 
-    private void setupOverlapBanner() {
+    private void setupBanner(@APageStyle int pageStyle) {
         mViewPager
-                .setIndicatorVisibility(View.GONE) // 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
-                .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
-                .setIndicatorView(indicatorView)
+                .setPageMargin(BannerUtils.dp2px(10))
+                .setRevealWidth(BannerUtils.dp2px(10))
+                .setPageStyle(pageStyle)
                 .create(getMDrawableList());
     }
 
-    //  网易云音乐、QQ音乐类似的Banner都可以通过设置不同的pargeMargin和revealWidth来实现
+    //  仿QQ音乐的Banner
     private void setNetEaseMusicStyle() {
         mViewPager
-                .setPageMargin(BannerUtils.dp2px(30))
-                .setRevealWidth(BannerUtils.dp2px(-15))
+                .setPageMargin(BannerUtils.dp2px(15))
+                .setRevealWidth(BannerUtils.dp2px(0))
                 .setPageStyle(PageStyle.MULTI_PAGE)
                 .setHolderCreator(() -> new ImageResourceViewHolder(BannerUtils.dp2px(5)))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))

+ 12 - 10
app/src/main/java/com/example/zhpan/circleviewpager/view/FigureIndicatorView.java

@@ -26,7 +26,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
 
     private int textColor = Color.WHITE;
 
-    private int textSize= BannerUtils.dp2px(13);
+    private int textSize = BannerUtils.dp2px(13);
 
     public FigureIndicatorView(Context context) {
         this(context, null);
@@ -50,15 +50,17 @@ public class FigureIndicatorView extends BaseIndicatorView {
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
-        mPaint.setColor(backgroundColor);
-        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mPaint);
-        mPaint.setColor(textColor);
-        mPaint.setTextSize(textSize);
-        String text = getCurrentPosition() + 1 + "/" + getPageSize();
-        int textWidth = (int) mPaint.measureText(text);
-        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
-        int baseline = (getMeasuredHeight() - fontMetricsInt.bottom + fontMetricsInt.top) / 2 - fontMetricsInt.top;
-        canvas.drawText(text, (getWidth() - textWidth) / 2, baseline, mPaint);
+        if (getPageSize() > 1) {
+            mPaint.setColor(backgroundColor);
+            canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mPaint);
+            mPaint.setColor(textColor);
+            mPaint.setTextSize(textSize);
+            String text = getCurrentPosition() + 1 + "/" + getPageSize();
+            int textWidth = (int) mPaint.measureText(text);
+            Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
+            int baseline = (getMeasuredHeight() - fontMetricsInt.bottom + fontMetricsInt.top) / 2 - fontMetricsInt.top;
+            canvas.drawText(text, (getWidth() - textWidth) / 2, baseline, mPaint);
+        }
     }
 
     public void setRadius(int radius) {

BIN
app/src/main/res/drawable-xhdpi/mine_hover.png


BIN
app/src/main/res/drawable-xhdpi/mine_none.png


+ 6 - 0
app/src/main/res/drawable-xhdpi/tab4_selector.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/mine_hover" android:state_checked="true" />
+    <item android:drawable="@drawable/mine_none" android:state_checked="false" />
+
+</selector>

+ 13 - 0
app/src/main/res/layout/activity_main.xml

@@ -56,6 +56,19 @@
                 android:text="@string/tab3"
                 android:textColor="@drawable/text_color_selector" />
 
+            <RadioButton
+                android:id="@+id/rb_others"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="bottom"
+                android:layout_weight="1"
+                android:button="@null"
+                android:drawableTop="@drawable/tab4_selector"
+                android:gravity="center_horizontal|bottom"
+                android:paddingBottom="5dp"
+                android:text="@string/tab4"
+                android:textColor="@drawable/text_color_selector" />
+
 
         </RadioGroup>
 

+ 4 - 19
app/src/main/res/layout/fragment_find.xml

@@ -11,20 +11,13 @@
         android:layout_marginTop="20dp"
         app:bvp_page_style="multi_page" />
 
-    <com.zhpan.bannerview.indicator.IndicatorView
-        android:id="@+id/indicator_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/banner_view"
-        android:layout_centerHorizontal="true"
-        android:layout_marginTop="10dp" />
-
     <TextView
         android:id="@+id/tv_page_style"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_below="@id/indicator_view"
+        android:layout_below="@id/banner_view"
         android:layout_marginStart="10dp"
+        android:layout_marginTop="10dp"
         android:text="@string/text_page_style"
         android:textColor="#000000"
         android:textSize="18sp"
@@ -59,20 +52,12 @@
             android:text="MULTI_PAGE_OVERLAP" />
 
         <RadioButton
-            android:id="@+id/rb_multi_page_wy"
+            android:id="@+id/rb_qq_music_style"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="15dp"
-            android:text="仿网易云(QQ)音乐Banner" />
+            android:text="QQ Music Banner Style" />
 
     </RadioGroup>
 
-    <Button
-        android:id="@+id/btn_refresh"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_centerHorizontal="true"
-        android:text="Refresh Data" />
-
 </RelativeLayout>

+ 64 - 0
app/src/main/res/layout/fragment_indicator.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.zhpan.bannerview.BannerViewPager
+        android:id="@+id/banner_view"
+        android:layout_width="match_parent"
+        android:layout_height="180dp"
+        android:layout_margin="10dp"
+        app:bvp_indicator_visibility="visible"
+        app:bvp_round_corner="8dp" />
+
+    <TextView
+        android:id="@+id/tv_page_style"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginTop="10dp"
+        android:text="@string/text_indicator_style"
+        android:textColor="#000000"
+        android:textSize="18sp"
+        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="15dp">
+
+        <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="16sp" />
+
+        <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="16sp" />
+
+        <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="16sp" />
+
+    </RadioGroup>
+
+
+</LinearLayout>

+ 34 - 14
app/src/main/res/layout/fragment_others.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
@@ -13,10 +13,18 @@
         app:bvp_indicator_visibility="visible"
         app:bvp_round_corner="8dp" />
 
+    <com.zhpan.bannerview.indicator.IndicatorView
+        android:id="@+id/indicator_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/banner_view"
+        android:layout_centerHorizontal="true" />
+
     <TextView
         android:id="@+id/tv_page_style"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_below="@id/indicator_view"
         android:layout_marginStart="10dp"
         android:layout_marginTop="10dp"
         android:text="@string/text_indicator_style"
@@ -28,15 +36,17 @@
         android:id="@+id/rg_indicator_style"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal"
+        android:layout_below="@id/tv_page_style"
+        android:orientation="vertical"
         android:padding="15dp">
 
         <RadioButton
-            android:id="@+id/rb_circle"
+            android:id="@+id/rb_indicator_below"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginEnd="15dp"
-            android:text="Circle"
+            android:layout_marginBottom="@dimen/dp_10"
+            android:text="Indicator below of Banner"
             android:textSize="16sp" />
 
         <RadioButton
@@ -44,22 +54,18 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginEnd="15dp"
-            android:text="Dash"
+            android:layout_marginBottom="@dimen/dp_10"
+            android:text="Custom Indicator"
             android:textSize="16sp" />
 
-        <RadioButton
-            android:id="@+id/rb_custom"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Custom"
-            android:textSize="16sp" />
+
     </RadioGroup>
 
     <TextView
         android:id="@+id/tv_photo_view"
         android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:layout_marginTop="20dp"
+        android:layout_height="45dp"
+        android:layout_below="@id/rg_indicator_style"
         android:background="@color/white"
         android:gravity="center"
         android:onClick="onClick"
@@ -67,4 +73,18 @@
         android:textColor="#000000"
         android:textSize="16sp" />
 
-</LinearLayout>
+    <TextView
+        android:id="@+id/btn_refresh"
+        android:layout_width="match_parent"
+        android:layout_height="45dp"
+        android:layout_below="@id/tv_photo_view"
+        android:layout_centerHorizontal="true"
+        android:background="@color/white"
+        android:gravity="center"
+        android:layout_marginTop="@dimen/dp_10"
+        android:text="Refresh"
+        android:textColor="#000000"
+        android:textSize="16sp" />
+
+
+</RelativeLayout>

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

@@ -11,4 +11,8 @@
     <string name="tab3">Indicator</string>
     <string name="text_page_style">Page Style:</string>
     <string name="text_indicator_style">Indicator Style:</string>
+
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
+    <string name="tab4">Others</string>
 </resources>

+ 1 - 1
bannerview/build.gradle

@@ -5,7 +5,7 @@ android {
     compileSdkVersion 28
 
     defaultConfig {
-        minSdkVersion 19
+        minSdkVersion 16
         targetSdkVersion 28
         versionCode 1
         versionName "1.0"

+ 10 - 12
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -56,6 +56,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private int currentPosition;
 
+    private boolean isCustomIndicator;
+
     private OnPageClickListener mOnPageClickListener;
 
     private IIndicator mIndicatorView;
@@ -200,7 +202,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private void setIndicatorValues() {
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
-        if (bannerOptions.isCustomIndicator() && null != mIndicatorView) {
+        if (isCustomIndicator && null != mIndicatorView) {
             initIndicator(mIndicatorView);
         } else {
             initIndicator(new IndicatorView(getContext()));
@@ -228,10 +230,10 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
                 layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
                 break;
             case START:
-                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
+                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                 break;
             case END:
-                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
+                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                 break;
         }
     }
@@ -261,6 +263,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
             removeAllViews();
             mViewPager.setAdapter(getPagerAdapter());
             mViewPager.setCurrentItem(currentPosition);
+            mViewPager.removeOnPageChangeListener(this);
             mViewPager.addOnPageChangeListener(this);
             BannerOptions bannerOptions = mBannerManager.bannerOptions();
             mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
@@ -576,7 +579,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      */
     public BannerViewPager<T, VH> setIndicatorView(IIndicator customIndicator) {
         if (customIndicator instanceof View) {
-            mBannerManager.bannerOptions().setCustomIndicator(true);
+//            mBannerManager.bannerOptions().setCustomIndicator(true);
+            isCustomIndicator = true;
             mIndicatorView = customIndicator;
         }
         return this;
@@ -585,9 +589,10 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     /**
      * 设置Indicator样式
      *
-     * @param indicatorStyle indicator样式,目前有圆和断线两种样式
+     * @param indicatorStyle indicator样式,目前有圆、短线及圆角矩形三种样式
      *                       {@link IndicatorStyle#CIRCLE}
      *                       {@link IndicatorStyle#DASH}
+     *                       {@link IndicatorStyle#ROUND_RECT}
      */
     public BannerViewPager<T, VH> setIndicatorStyle(@AIndicatorStyle int indicatorStyle) {
         mBannerManager.bannerOptions().setIndicatorStyle(indicatorStyle);
@@ -700,11 +705,4 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         mOnPageChangeListener = onPageChangeListener;
         return this;
     }
-
-    //  仅供demo使用
-//    @Deprecated
-//    public void resetIndicator() {
-//        mBannerManager.bannerOptions().setCustomIndicator(false);
-//        mIndicatorView = null;
-//    }
 }

+ 1 - 0
bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorStyle.java

@@ -9,4 +9,5 @@ package com.zhpan.bannerview.constants;
 public interface IndicatorStyle {
     int CIRCLE = 0;
     int DASH = 1 << 1;
+    int ROUND_RECT = 1 << 2;
 }

+ 2 - 1
bannerview/src/main/java/com/zhpan/bannerview/indicator/IndicatorView.java

@@ -13,9 +13,10 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
 /**
  * <pre>
  *   Created by zhpan on 2019/11/23.
- *   Description:The Indicator in BannerViewPager,this include two indicator style,as below:
+ *   Description:The Indicator in BannerViewPager,this include three indicator styles,as below:
  *  {@link com.zhpan.bannerview.constants.IndicatorStyle#CIRCLE }
  *  {@link com.zhpan.bannerview.constants.IndicatorStyle#DASH}
+ *  {@link com.zhpan.bannerview.constants.IndicatorStyle#ROUND_RECT}
  * </pre>
  */
 public class IndicatorView extends BaseIndicatorView implements IIndicator {

+ 5 - 1
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerFactory.java

@@ -3,6 +3,7 @@ package com.zhpan.bannerview.indicator.drawer;
 import com.zhpan.bannerview.manager.IndicatorOptions;
 
 import static com.zhpan.bannerview.constants.IndicatorStyle.DASH;
+import static com.zhpan.bannerview.constants.IndicatorStyle.ROUND_RECT;
 
 /**
  * <pre>
@@ -13,8 +14,11 @@ import static com.zhpan.bannerview.constants.IndicatorStyle.DASH;
 class DrawerFactory {
     static IDrawer createDrawer(IndicatorOptions indicatorOptions) {
         IDrawer drawer;
-        if (indicatorOptions.getIndicatorStyle() == DASH) {
+        int indicatorStyle = indicatorOptions.getIndicatorStyle();
+        if (indicatorStyle == DASH) {
             drawer = new DashDrawer(indicatorOptions);
+        } else if (indicatorStyle == ROUND_RECT) {
+            drawer = new RoundRectDrawer(indicatorOptions);
         } else {
             drawer = new CircleDrawer(indicatorOptions);
         }

+ 107 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/RoundRectDrawer.java

@@ -0,0 +1,107 @@
+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;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2019/11/26.
+ *   Description:
+ * </pre>
+ */
+public class RoundRectDrawer extends BaseDrawer {
+
+    private float maxWidth;
+
+    private float minWidth;
+
+    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);
+                }
+            }
+        }
+    }
+
+    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 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);
+    }
+
+
+}

+ 0 - 1
bannerview/src/main/java/com/zhpan/bannerview/manager/AttributeController.java

@@ -54,7 +54,6 @@ public class AttributeController {
         mBannerOptions.setIndicatorGap(normalIndicatorWidth);
         mBannerOptions.setIndicatorHeight(normalIndicatorWidth / 2);
         mBannerOptions.setCheckedIndicatorWidth(normalIndicatorWidth);
-
     }
 
     private void initBannerAttrs(TypedArray typedArray) {

+ 0 - 10
bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java

@@ -35,8 +35,6 @@ public class BannerOptions {
 
     private int mRevealWidth;
 
-    private boolean isCustomIndicator;
-
     private int mPageStyle = PageStyle.NORMAL;
 
     private IndicatorMargin mIndicatorMargin;
@@ -183,14 +181,6 @@ public class BannerOptions {
         mIndicatorOptions.setSliderHeight(indicatorHeight);
     }
 
-    public boolean isCustomIndicator() {
-        return isCustomIndicator;
-    }
-
-    public void setCustomIndicator(boolean customIndicator) {
-        isCustomIndicator = customIndicator;
-    }
-
     public int getPageStyle() {
         return mPageStyle;
     }

+ 6 - 2
bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java

@@ -121,7 +121,9 @@ public class CatchViewPager extends ViewPager {
             Field mField = ViewPager.class.getDeclaredField("mScroller");
             mField.setAccessible(true);
             mField.set(this, mBannerScroller);
-        } catch (IllegalAccessException | NoSuchFieldException e) {
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
             e.printStackTrace();
         }
     }
@@ -132,7 +134,9 @@ public class CatchViewPager extends ViewPager {
             mFirstLayout.setAccessible(true);
             mFirstLayout.set(this, firstLayout);
             setCurrentItem(getCurrentItem());
-        } catch (IllegalAccessException | NoSuchFieldException e) {
+        } catch (IllegalAccessException  e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
             e.printStackTrace();
         }
     }

+ 11 - 10
bannerview/src/main/res/values/attrs.xml

@@ -16,28 +16,29 @@
 
         <attr name="bvp_indicator_style" format="enum">
             <enum name="circle" value="0" />
-            <enum name="dash" value="1" />
+            <enum name="dash" value="2" />
+            <enum name="round_rect" value="4" />
         </attr>
         <attr name="bvp_indicator_slide_mode" format="enum">
             <enum name="normal" value="0" />
-            <enum name="smooth" value="1" />
+            <enum name="smooth" value="2" />
         </attr>
         <attr name="bvp_indicator_gravity" format="enum">
             <enum name="center" value="0" />
-            <enum name="start" value="1" />
-            <enum name="end" value="2" />
+            <enum name="start" value="2" />
+            <enum name="end" value="4" />
         </attr>
         <attr name="bvp_page_style" format="enum">
             <enum name="normal" value="0" />
-            <enum name="multi_page" value="1" />
-            <enum name="multi_page_overlap" value="2" />
-            <enum name="multi_page_scale" value="3" />
+            <enum name="multi_page" value="2" />
+            <enum name="multi_page_overlap" value="4" />
+            <enum name="multi_page_scale" value="8" />
         </attr>
         <attr name="bvp_transformer_style" format="enum">
             <enum name="normal" value="0" />
-            <enum name="depth" value="1" />
-            <enum name="stack" value="2" />
-            <enum name="accordion" value="3" />
+            <enum name="depth" value="2" />
+            <enum name="stack" value="4" />
+            <enum name="accordion" value="8" />
         </attr>
 
         <attr name="bvp_indicator_visibility" format="enum">

+ 1 - 1
build.gradle

@@ -35,7 +35,7 @@ ext {
     compileSdkVersion=27
     buildToolsVersion = '28.0.0'
     targetSdkVersion = 26
-    minSdkVersion = 19
+    minSdkVersion = 16
     releaseVersionCode = 1
     releaseVersionName = '1.0.0'
 

BIN
download/app.apk


BIN
image/qq_group.png


BIN
image/style_round_rect.gif