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

+ 14 - 10
README.md

@@ -1,10 +1,10 @@
 # BannerViewPager
 
 [![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0)
-[![MinSdk](https://img.shields.io/badge/API-19%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=19)
+![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  |必须调用,否则前面设置的参数无效  |
 
@@ -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**
 

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

@@ -26,7 +26,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) {
 
@@ -48,6 +48,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
     }
@@ -61,6 +62,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)
                     }
                 })

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

@@ -5,12 +5,7 @@ import android.support.v4.app.FragmentManager
 import android.support.v4.app.FragmentPagerAdapter
 import android.util.SparseArray
 import android.view.ViewGroup
-
-
-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
         }
 
@@ -31,7 +27,7 @@ class AdapterFragmentPager(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
     override fun instantiateItem(container: ViewGroup, position: Int): Any {
         val fragment = super.instantiateItem(container, position) as Fragment
-        fragmentList!!.put(position, fragment as BaseFragment)
+        fragmentList?.put(position, fragment as BaseFragment)
         return fragment
     }
 
@@ -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
+
     }
 
 }

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

@@ -4,6 +4,7 @@ import android.content.Context
 import android.os.Bundle
 import android.support.annotation.ColorInt
 import android.support.annotation.ColorRes
+import android.support.v4.content.ContextCompat
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -50,7 +51,7 @@ abstract class BaseFragment : RxFragment() {
 
     @ColorInt
     protected fun getColor(@ColorRes colorRes: Int): Int {
-        return context!!.resources.getColor(colorRes)
+        return ContextCompat.getColor(context!!,colorRes)
     }
 
     /**

+ 9 - 8
app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java

@@ -109,18 +109,19 @@ public class HomeFragment extends BaseFragment {
         mBannerViewPager
                 .setAutoPlay(true)
                 .setInterval(5000)
-                .setRevealWidth(BannerUtils.dp2px(10))
+                .setScrollDuration(1200)
+//                .setRevealWidth(BannerUtils.dp2px(10))
                 .setPageMargin(BannerUtils.dp2px(10))
-                .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
+                .setPageStyle(PageStyle.MULTI_PAGE)
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setHolderCreator(NetViewHolder::new)
-                .setIndicatorMargin(0,0,0, (int) getResources().getDimension(R.dimen.dp_18))
-                .setOnPageClickListener(position -> {
-                    BannerData bannerData = mBannerViewPager.getList().get(position);
-                    Toast.makeText(getMContext(),
-                            "点击了position:" + position + " " + bannerData.getTitle(), Toast.LENGTH_SHORT).show();
+                .setIndicatorMargin(0, 0, 0, (int) getResources().getDimension(R.dimen.dp_18))
+                .setOnPageClickListener(this::onPageClicked);
+    }
 
-                });
+    private void onPageClicked(int position) {
+        BannerData bannerData = mBannerViewPager.getList().get(position);
+        Toast.makeText(getMContext(), "position:" + position + " " + bannerData.getTitle(), Toast.LENGTH_SHORT).show();
     }
 
     private View getHeaderView() {

+ 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));
-    }
 }

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

@@ -0,0 +1,138 @@
+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))
+                .setOnPageClickListener(position -> ToastUtils.show("Position:" + position))
+                .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>

+ 35 - 15
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,13 +13,21 @@
         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"
+        android:text="@string/custom_style"
         android:textColor="#000000"
         android:textSize="18sp"
         android:textStyle="bold" />
@@ -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>

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

@@ -9,6 +9,8 @@
     <string name="tab1">Home</string>
     <string name="tab2">Page</string>
     <string name="tab3">Indicator</string>
+    <string name="tab4">Others</string>
     <string name="text_page_style">Page Style:</string>
     <string name="text_indicator_style">Indicator Style:</string>
+    <string name="custom_style">Custom Style</string>
 </resources>

+ 2 - 2
bannerview/build.gradle

@@ -5,7 +5,7 @@ android {
     compileSdkVersion 27
 
     defaultConfig {
-        minSdkVersion 19
+        minSdkVersion 16
         targetSdkVersion 26
         versionCode 1
         versionName "1.0"
@@ -37,7 +37,7 @@ dependencies {
     implementation 'com.android.support:appcompat-v7:27.1.1'
 }
 
-version = "2.5.0"
+version = "2.5.2"
 def siteUrl = 'https://github.com/zhpanvip/BannerViewPager'      // 项目的主页
 def gitUrl = 'https://github.com/zhpanvip/BannerViewPager.git'   // Git仓库的url
 group = "com.zhpan.library" // Maven Group ID for the artifact,一般填你唯一的包名

+ 85 - 55
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -37,7 +37,6 @@ import com.zhpan.bannerview.provider.ViewStyleSetter;
 import com.zhpan.bannerview.transform.PageTransformerFactory;
 import com.zhpan.bannerview.view.CatchViewPager;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static com.zhpan.bannerview.adapter.BannerPagerAdapter.MAX_VALUE;
@@ -55,6 +54,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private int currentPosition;
 
+    private boolean isCustomIndicator;
+
     private OnPageClickListener mOnPageClickListener;
 
     private IIndicator mIndicatorView;
@@ -63,8 +64,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private CatchViewPager mViewPager;
 
-    private List<T> mList;
-
     private BannerManager mBannerManager;
 
     private HolderCreator<VH> holderCreator;
@@ -96,7 +95,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         inflate(getContext(), R.layout.layout_banner_view_pager, this);
         mViewPager = findViewById(R.id.vp_main);
         mIndicatorLayout = findViewById(R.id.rl_indicator);
-        mList = new ArrayList<>();
     }
 
     @Override
@@ -135,11 +133,12 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     @Override
     public void onPageSelected(int position) {
         // Optimized For Issue #42
-        if (mList.size() > 0 && isCanLoop() && position == 0) {
-            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
-            setCurrentItem(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()));
+        int size = mBannerPagerAdapter.getListSize();
+        if (size > 0 && isCanLoop() && position == 0) {
+            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % size) + 1;
+            setCurrentItem(0, false);
         }
-        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, mList.size());
+        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
         if (mOnPageChangeListener != null)
             mOnPageChangeListener.onPageSelected(currentPosition);
         if (mIndicatorView != null) {
@@ -159,17 +158,20 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
+        int listSize = mBannerPagerAdapter.getListSize();
+        if (listSize > 0) {
+            if (mOnPageChangeListener != null) {
+                mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
+                        positionOffset, positionOffsetPixels);
+            }
+            if (mIndicatorView != null)
+                mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
+                        positionOffset, positionOffsetPixels);
         }
-        if (mIndicatorView != null)
-            mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
     }
 
     private void handlePosition() {
-        if (mList.size() > 1) {
+        if (mBannerPagerAdapter.getListSize() > 1) {
             currentPosition = mViewPager.getCurrentItem() + 1;
             mViewPager.setCurrentItem(currentPosition);
             mHandler.postDelayed(mRunnable, getInterval());
@@ -178,34 +180,34 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private void initBannerData(List<T> list) {
         if (list != null) {
-            initList(list);
-            setupViewPager();
+            setIndicatorValues(list);
+            setupViewPager(list);
             initRoundCorner();
         }
     }
 
-    private void initList(List<T> list) {
-        mList.clear();
-        mList.addAll(list);
-        if (mList.size() > 1) {
-            setIndicatorValues();
-        } else if (mIndicatorView != null) {
-            mIndicatorView.setPageSize(mList.size());
-        }
-        if (mList.size() > 0 && isCanLoop()) {
-            currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
-        }
-    }
+//    private void initList(List<T> list) {
+//        mList.clear();
+//        mList.addAll(list);
+//        mIndicatorView.setPageSize(mList.size());
+//        if (mList.size() > 1) {
+//            setIndicatorValues();
+//        } else if (mIndicatorView != null) {
+//            mIndicatorView.setPageSize(mList.size());
+//        }
+//        setIndicatorValues(list);
+//
+//    }
 
-    private void setIndicatorValues() {
+    private void setIndicatorValues(List<T> list) {
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
-        if (bannerOptions.isCustomIndicator() && null != mIndicatorView) {
+        if (isCustomIndicator && null != mIndicatorView) {
             initIndicator(mIndicatorView);
         } else {
             initIndicator(new IndicatorView(getContext()));
         }
         mIndicatorView.setIndicatorOptions(bannerOptions.getIndicatorOptions());
-        mIndicatorView.setPageSize(mList.size());
+        mIndicatorView.setPageSize(list.size());
     }
 
     private void initIndicator(IIndicator indicatorView) {
@@ -227,10 +229,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;
         }
     }
@@ -255,11 +257,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    private void setupViewPager() {
+    private void setupViewPager(List<T> list) {
         if (holderCreator != null) {
+            if (list.size() > 0 && isCanLoop()) {
+                currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1;
+            }
             removeAllViews();
-            mViewPager.setAdapter(getPagerAdapter());
+            mViewPager.setAdapter(getPagerAdapter(list));
             mViewPager.setCurrentItem(currentPosition);
+            mViewPager.removeOnPageChangeListener(this);
             mViewPager.addOnPageChangeListener(this);
             BannerOptions bannerOptions = mBannerManager.bannerOptions();
             mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
@@ -275,16 +281,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    private PagerAdapter getPagerAdapter() {
-        BannerPagerAdapter<T, VH> bannerPagerAdapter =
-                new BannerPagerAdapter<>(mList, holderCreator);
-        bannerPagerAdapter.setCanLoop(isCanLoop());
-        bannerPagerAdapter.setPageClickListener(position -> {
+    private BannerPagerAdapter<T, VH> mBannerPagerAdapter;
+
+    private PagerAdapter getPagerAdapter(List<T> list) {
+        mBannerPagerAdapter =
+                new BannerPagerAdapter<>(list, holderCreator);
+        mBannerPagerAdapter.setCanLoop(isCanLoop());
+        mBannerPagerAdapter.setPageClickListener(position -> {
             if (mOnPageClickListener != null) {
                 mOnPageClickListener.onPageClick(position);
             }
         });
-        return bannerPagerAdapter;
+        return mBannerPagerAdapter;
     }
 
     private void initPageStyle() {
@@ -337,14 +345,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @return BannerViewPager数据集合
      */
     public List<T> getList() {
-        return mList;
+        return mBannerPagerAdapter.getList();
     }
 
     /**
      * 开启轮播
      */
     public void startLoop() {
-        if (!isLooping() && isAutoPlay() && mList.size() > 1) {
+        if (!isLooping() && isAutoPlay() && mBannerPagerAdapter != null &&
+                mBannerPagerAdapter.getListSize() > 1) {
             mHandler.postDelayed(mRunnable, getInterval());
             setLooping(true);
         }
@@ -575,7 +584,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;
@@ -584,9 +594,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);
@@ -602,6 +613,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         initBannerData(list);
     }
 
+//    public void update(List<T> list) {
+//        if (null != list) {
+//            if (mBannerPagerAdapter != null && mBannerManager.bannerOptions().getPageStyle() == PageStyle.NORMAL) {
+//                mBannerPagerAdapter.setList(list);
+//                mIndicatorView.setPageSize(list.size());
+////                setCurrentItem(0, false);
+//            } else {
+//                initBannerData(list);
+//            }
+//        }
+//    }
+
     /**
      * @return the currently selected page position.
      */
@@ -617,7 +640,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param item Item index to select
      */
     public void setCurrentItem(int item) {
-        mViewPager.setCurrentItem(isCanLoop() ? MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1 + item : item);
+        if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
+            removeAllViews();
+            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item);
+            addView(mViewPager);
+            addView(mIndicatorLayout);
+        } else {
+            mViewPager.setCurrentItem(item);
+        }
     }
 
     /**
@@ -627,7 +657,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
      */
     public void setCurrentItem(int item, boolean smoothScroll) {
-        mViewPager.setCurrentItem(isCanLoop() ? MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1 + item : item, smoothScroll);
+        if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
+            removeAllViews();
+            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item, smoothScroll);
+            addView(mViewPager);
+            addView(mIndicatorLayout);
+        } else {
+            mViewPager.setCurrentItem(item, smoothScroll);
+        }
     }
 
     /**
@@ -699,11 +736,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;
-//    }
 }

+ 23 - 1
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -32,7 +32,8 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     public static final int MAX_VALUE = Integer.MAX_VALUE;
 
     public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
-        this.mList = list;
+        mList = new ArrayList<>();
+        mList.addAll(list);
         this.holderCreator = holderCreator;
     }
 
@@ -58,6 +59,11 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
         return itemView;
     }
 
+//    @Override
+//    public int getItemPosition(@NonNull Object object) {
+//        return POSITION_NONE;
+//    }
+
     private View findViewByPosition(ViewGroup container, int position) {
         for (View view : mViewList) {
             if (((int) view.getTag()) == position && view.getParent() == null) {
@@ -119,4 +125,20 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     public interface PageClickListener {
         void onPageClick(int position);
     }
+
+//    public void setList(List<T> list) {
+//        mList.clear();
+//        notifyDataSetChanged();
+//        mList.addAll(list);
+//        notifyDataSetChanged();
+//        mViewList.clear();
+//    }
+
+    public List<T> getList() {
+        return mList;
+    }
+
+    public int getListSize() {
+        return mList.size();
+    }
 }

+ 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;
 }

+ 14 - 7
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 {
@@ -35,6 +36,12 @@ public class IndicatorView extends BaseIndicatorView implements IIndicator {
         mDrawerProxy = new DrawerProxy(getIndicatorOptions());
     }
 
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+        mDrawerProxy.onLayout(changed,left,top,right,bottom);
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
@@ -42,15 +49,15 @@ public class IndicatorView extends BaseIndicatorView implements IIndicator {
         setMeasuredDimension(measureResult.getMeasureWidth(), measureResult.getMeasureHeight());
     }
 
-    @Override
-    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
-        super.setIndicatorOptions(indicatorOptions);
-        mDrawerProxy.setIndicatorOptions(indicatorOptions);
-    }
-
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         mDrawerProxy.onDraw(canvas);
     }
+
+    @Override
+    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
+        super.setIndicatorOptions(indicatorOptions);
+        mDrawerProxy.setIndicatorOptions(indicatorOptions);
+    }
 }

+ 5 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/BaseDrawer.java

@@ -25,6 +25,11 @@ public abstract class BaseDrawer implements IDrawer {
         mMeasureResult = new MeasureResult();
     }
 
+    @Override
+    public void onLayout(boolean changed, int left, int top, int right, int bottom) {
+
+    }
+
     public class MeasureResult {
 
         int measureWidth;

+ 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);
         }

+ 7 - 2
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerProxy.java

@@ -25,8 +25,9 @@ public class DrawerProxy implements IDrawer {
         mIDrawer = DrawerFactory.createDrawer(indicatorOptions);
     }
 
-    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
-        init(indicatorOptions);
+    @Override
+    public void onLayout(boolean changed, int left, int top, int right, int bottom) {
+
     }
 
     @Override
@@ -38,4 +39,8 @@ public class DrawerProxy implements IDrawer {
     public void onDraw(Canvas canvas) {
         mIDrawer.onDraw(canvas);
     }
+
+    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
+        init(indicatorOptions);
+    }
 }

+ 2 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/IDrawer.java

@@ -12,6 +12,8 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
  */
 public interface IDrawer {
 
+    void onLayout(boolean changed, int left, int top, int right, int bottom);
+
     BaseDrawer.MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec);
 
     void onDraw(Canvas canvas);

+ 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

@@ -120,7 +120,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();
         }
     }
@@ -131,7 +133,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 = '27.1.1'
     targetSdkVersion = 26
-    minSdkVersion = 19
+    minSdkVersion = 16
     releaseVersionCode = 1
     releaseVersionName = '1.0.0'
     supportLibVersion = "27.1.1"

BIN
download/app.apk


BIN
image/qq_group.png


BIN
image/style_round_rect.gif