Explorar el Código

Merge pull request #97 from zhpanvip/dev_3.0.0

V 3.0.0 Migrate to ViewPager2
zhpanvip hace 5 años
padre
commit
4a7f278fb0
Se han modificado 42 ficheros con 1236 adiciones y 843 borrados
  1. 1 5
      README.md
  2. 1 5
      README_CN.md
  3. 451 0
      README_v2.x.md
  4. 2 2
      app/build.gradle
  5. 4 4
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.kt
  6. 2 1
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.kt
  7. 18 23
      app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.kt
  8. 32 0
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/HomeAdapter.java
  9. 39 0
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/ImageResourceAdapter.java
  10. 28 0
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/PhotoAdapter.kt
  11. 35 0
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/WelcomeAdapter.kt
  12. 8 8
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
  13. 7 8
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java
  14. 16 19
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java
  15. 9 11
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java
  16. 13 13
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/CustomPageViewHolder.java
  17. 12 12
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/ImageResourceViewHolder.java
  18. 10 8
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java
  19. 8 10
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/PhotoViewHolder.kt
  20. 1 1
      app/src/main/res/layout/item_net.xml
  21. 1 1
      app/src/main/res/layout/item_slide_mode.xml
  22. 1 1
      app/src/main/res/layout/item_view.xml
  23. 4 75
      bannerview/build.gradle
  24. 231 223
      bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
  25. 82 0
      bannerview/src/main/java/com/zhpan/bannerview/BaseBannerAdapter.java
  26. 84 0
      bannerview/src/main/java/com/zhpan/bannerview/BaseViewHolder.java
  27. 0 146
      bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java
  28. 0 21
      bannerview/src/main/java/com/zhpan/bannerview/adapter/OnPageChangeListenerAdapter.java
  29. 3 1
      bannerview/src/main/java/com/zhpan/bannerview/constants/PageStyle.java
  30. 0 13
      bannerview/src/main/java/com/zhpan/bannerview/holder/HolderCreator.java
  31. 0 26
      bannerview/src/main/java/com/zhpan/bannerview/holder/ViewHolder.java
  32. 1 0
      bannerview/src/main/java/com/zhpan/bannerview/indicator/CircleIndicatorView.java
  33. 24 12
      bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java
  34. 0 36
      bannerview/src/main/java/com/zhpan/bannerview/provider/BannerScroller.java
  35. 3 2
      bannerview/src/main/java/com/zhpan/bannerview/transform/BaseTransformer.java
  36. 12 0
      bannerview/src/main/java/com/zhpan/bannerview/transform/Extensions.kt
  37. 85 0
      bannerview/src/main/java/com/zhpan/bannerview/transform/OverlapPageTransformer.kt
  38. 3 3
      bannerview/src/main/java/com/zhpan/bannerview/transform/PageTransformerFactory.java
  39. 2 2
      bannerview/src/main/java/com/zhpan/bannerview/transform/ScaleInTransformer.java
  40. 0 147
      bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java
  41. 2 3
      bannerview/src/main/res/layout/bvp_layout.xml
  42. 1 1
      build.gradle

+ 1 - 5
README.md

@@ -391,7 +391,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
  
  - [x] Refactor Indicator again (2.5.0)
  - [x] Fix issue #34 which Indicator smooth slide problem(2.6.1).
- - [ ] Migrate to ViewPager2 (3.0.0)
+ - [x] Migrate to ViewPager2 (3.0.0)
 
 ## FAQ
 
@@ -418,10 +418,6 @@ public class FigureIndicatorView extends BaseIndicatorView {
 
 ## Thanks
 
-[banner](https://github.com/youth5201314/banner)
-
-[Android-ConvenientBanner](https://github.com/saiwu-bigkoo/Android-ConvenientBanner)
-
 [ViewPagerTransforms](https://github.com/ToxicBakery/ViewPagerTransforms)
 
 [玩Android](https://wanandroid.com/)

+ 1 - 5
README_CN.md

@@ -391,7 +391,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
  - [x] 重构Indicator,~~尽量修复Indicator SMOOTH模式下滑动问题~~ (2.5.0)
  - [x] 目前Indicator部分代码比较乱,还有很大很大的优化空间,后续版本将持续优化(2.5.0对Indicator再次进行了重构,重构后代码已经很整洁,但仍然有优化空间)
  - [x] 修复 issue #34 Indicator 在Smooth模式下存在的问题 (2.6.1).
- - [ ] ViewPager更换为ViewPager2 (3.0.0)
+ - [x] ViewPager更换为ViewPager2 (3.0.0)
 
 ## 有问题可以扫码加QQ群交流
 
@@ -418,10 +418,6 @@ public class FigureIndicatorView extends BaseIndicatorView {
 
 ## 感谢
 
-[banner](https://github.com/youth5201314/banner)
-
-[Android-ConvenientBanner](https://github.com/saiwu-bigkoo/Android-ConvenientBanner)
-
 [ViewPagerTransforms](https://github.com/ToxicBakery/ViewPagerTransforms)
 
 [玩Android](https://wanandroid.com/)

+ 451 - 0
README_v2.x.md

@@ -0,0 +1,451 @@
+# 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-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)
+
+## English | [中文](https://github.com/zhpanvip/BannerViewPager/blob/master/README_CN.md)
+
+> Tencent Video,QQ Music,KuGou,AliPay,Tmall,TaoBao,YouKu,Himalaya,NetEase Music,Bilibili ect. All of above App's Banner can be implements By BannerViewPager.
+
+## Preview
+
+ ### [Click here or scan the QR code to download demo apk](https://github.com/zhpanvip/BannerViewPager/raw/master/app/release/app-release.apk)
+
+![QRCode](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qrcode.png)
+
+
+### 1.PageStyle
+
+[Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java)
+
+| MULTI_PAGE |MULTI_PAGE_SCALE | MULTI_PAGE_OVERLAP |
+|--|--|--|
+| ![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_overlay.gif) |
+
+### 2.Indicator
+
+The IndicatorView was split from BannerViewPager,the new repo is [ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator),Click the link to see more information about [ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator)
+
+#### (1)setIndicatorStyle and setIndicatorSlideMode
+
+BannerViewPager supports three Indicator Styles and three Indicator Slide mode now. 
+
+[Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
+
+| Attrs | CIRCLE | DASH | ROUND_RECT |
+|--|--|--|--|
+| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_normal.gif) |
+| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_smooth.gif) |
+| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_worm.gif) |
+
+#### (2)Custom Indicator
+
+It's also support to custom indicator style,just need extends BaseIndicatorView or implement the IIndicator and override methods, then you can draw Indicators for whatever you want.
+
+[Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java)
+
+| Figure Indicator | Drawable Indicator | Indicator below of Banner |
+|--|--|--|
+| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom2.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom1.gif) |
+
+
+### 3.PageTransformerStyle
+
+[Sample Click Here](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java)
+
+| parameters | STACK | ROTATE | DEPTH | ACCORDION |
+|--|--|--|--|--|
+| Preview | ![STACK](https://github.com/zhpanvip/BannerViewPager/blob/master/image/transform_stack.gif) | ![ROTATE_DOWN](https://github.com/zhpanvip/BannerViewPager/blob/master/image/transform_rotate.gif) | ![DEPTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/transform_depth.gif)  |![ACCORDION](https://github.com/zhpanvip/BannerViewPager/blob/master/image/transform_accordion.gif)  |
+
+## API
+
+| Method | Description | Default |
+|--|--|--|
+| BannerViewPager<T, VH> setCanLoop(boolean canLoop) | set is can loop | default value is true|
+| BannerViewPager<T, VH> setAutoPlay(boolean autoPlay) | set is atuo play | default value true|
+| BannerViewPager<T, VH> setInterval(int interval) | set the interval of item switch interval |The unit is millisecond,default value 3000ms  |
+| BannerViewPager<T, VH> setScrollDuration(int scrollDuration) | set page scroll duration | set page scroll duration |unit is millisecond,default is 500ms |
+| BannerViewPager<T, VH> setRoundCorner(int radius) | set Round Rectangle style for Banner | required SDK_INT>=LOLLIPOP(API 21)  |
+| BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener onPageClickListener) | set item click listener |  |
+| BannerViewPager<T, VH> setHolderCreator(HolderCreator\<VH> holderCreator) |set Holder Creator  |You must set HolderCreator for BannerViewPager,or will throw NullPointerException|
+| BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) | indicator visibility |default value is VISIBLE,added in version 2.4.2|
+| BannerViewPager<T, VH> setIndicatorStyle(int indicatorStyle) | set indicator style | enum(CIRCLE, DASH、ROUND_RECT) default CIRCLE  |
+| BannerViewPager<T, VH> setIndicatorGravity(int gravity) | set indicator gravity |enum(CENTER、START、END) default value CENTER |
+| BannerViewPager<T, VH> setIndicatorColor(int normalColor,int checkedColor) | set indicator color |normalColor:color of indicator dot not selected, default value  "#8C6C6D72", checkedColor:color of indicator selected default value is "#8C18171C" |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | set indicator slide mode | enum(NORMAL;SMOOTH;WORM),default value NORMAL  |
+| BannerViewPager<T, VH> setIndicatorSliderRadius(int radius) | set indicator dot radius | default value is 4dp|
+| BannerViewPager<T, VH> setIndicatorSliderRadius(int normalRadius,int checkRadius)  |set indicator dot radius  |  normalRadius:normal radius of indicator dot,  checkedRadius:checked radius of indicator dot,default value is 4dp |
+| BannerViewPager<T, VH> setIndicatorSliderWidth(int indicatorWidth) | set indicator dot width,if it's Circle indicator the parameter is diameter of circle | default value is 8dp|
+| BannerViewPager<T, VH> setIndicatorSliderWidth(int normalWidth, int checkWidth) | set indicator dot width,if is circle style,the width is diameter of circle | default is 8dp |
+| BannerViewPager<T, VH> setIndicatorHeight(int indicatorHeight) | set indicator hight,it's only used when the indicator style is dash | default value is normalIndicatorWidth/2 |
+| BannerViewPager<T, VH> setIndicatorSliderGap(int indicatorMargin) | set the gap of indicator dot| default value is indicator dot width(or the diameter of circle)|
+| BannerViewPager<T, VH> setIndicatorView(IIndicator indicatorView) | set custom indicator|The custom indicator must extends BaseIndicatorView or implements IIndicator |
+| BannerViewPager<T, VH> setPageTransformerStyle(int style) | set transform style |  |
+| BannerViewPager<T, VH> setCurrentItem(int item) | Set the currently selected page. |  add in v2.3.5 |
+| int getCurrentItem() | get the current page position | added in v2.3.5 |
+| BannerViewPager<T, VH> setPageStyle(PageStyle pageStyle) | setPageStyle | support in v2.4.0. enum(MULTI_PAGE、MULTI_PAGE_SCALE、MULTI_PAGE_OVERLAP)|
+| BannerViewPager<T, VH> setPageMargin(int pageMargin) | set item margin | added in v2.4.0 |
+| BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) | set margin for indicator | added in v2.4.1 |
+| BannerViewPager<T, VH> setOnPageChangeListener(OnPageChangeListener l) | set page change listener for BannerViewPager | added in v2.4.3 |
+| void startLoop() |start loop | the method will be called when BannerViewPager was initialized |
+| void stopLoop() | stop loop | |
+| List\<T> getList() | get data in BannerViewPager |  |
+| void create(List<T> list) |initialize BannerViewPager  |You must call this method when data is set |
+
+### Attributes in xml
+| Attributes | format | description |
+|--|--|--|
+| bvp_interval | integer | set page switch interval |
+| bvp_scroll_duration | integer | set page scroll duration|
+| bvp_can_loop | boolean|set is can loop |
+| bvp_auto_play | boolean | set is can auto play  |
+| bvp_indicator_checked_color | color | set checked color for indicator |
+| bvp_indicator_normal_color | color | set normal color for indicator |
+| bvp_indicator_radius | dimension | if it's circle style the value is radius of circle,if the indicator style is DASH or ROUND_RECT the value is width/2  |
+| bvp_round_corner| dimension  | set round corner for banner |
+| bvp_page_margin | dimension | set item margin |
+| bvp_reveal_width | dimension | it's only used when the page style is MULTI_PAGE/MULTI_PAGE_SCALE/MULTI_PAGE_OVERLAP,the value is two side item reveal width |
+| bvp_indicator_style | enum | indicator style. enum(circle/dash)  |
+| bvp_indicator_slide_mode | enum | indicator slide mode.enum(normal;smooth;worm) |
+| bvp_indicator_gravity | enum | indicator gravity. enum(center/start/end) |
+| bvp_page_style | enum | page style. enum(normal/multi_page/multi_page_overlap/multi_page_scale) |
+| bvp_transformer_style | enum | transform style. enum(normal/depth/stack/accordion) |
+| bvp_indicator_visibility| enum | indicator visibility(visible/gone/invisible) |
+
+
+## Usage
+
+### 1.Gradle dependency
+   
+
+If you have migrated to Androidx,please add it in your root build.gradle at the end of repositories:
+
+```
+allprojects {
+		repositories {
+			...
+			maven { url 'https://jitpack.io' }
+		}
+	}
+	
+```
+Then add the dependency in your app build.gradle
+
+```
+implementation 'com.github.zhpanvip:BannerViewPager:latestVersion'
+
+```
+
+Androidx latestVersion:[![latestVersion](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
+
+If you are still using android support library,you can add the dependency in your app build.gradle:
+```
+implementation 'com.zhpan.library:bannerview:latestVersion'
+```
+
+Android support latestVersion: [ ![latestVersion](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
+
+### 2.Add BannerViewPager in layout.xml
+
+```
+    <com.zhpan.bannerview.BannerViewPager
+            android:id="@+id/banner_view"
+            android:layout_width="match_parent"
+            android:layout_margin="10dp"
+            android:layout_height="160dp" />
+```
+
+### 3.The item layout of banner:
+
+```
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/banner_image"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:scaleType="centerCrop" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:background="#66000000"
+            android:gravity="center_vertical">
+
+            <TextView
+                android:id="@+id/tv_describe"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:layout_marginStart="15dp"
+                android:gravity="center_vertical"
+                android:paddingTop="5dp"
+                android:paddingBottom="5dp"
+                android:textColor="#FFFFFF"
+                android:textSize="16sp" />
+        </LinearLayout>
+
+    </RelativeLayout>
+```
+
+### 4.Set custom ViewHolder for BannerViewPager, the custom ViewHolder must implements com.zhpan.bannerview.holder.ViewHolder:
+
+```
+    public class NetViewHolder implements ViewHolder<CustomBean> {
+
+        @Override
+        public int getLayoutId() {
+            return R.layout.item_net;
+        }
+
+        @Override
+        public void onBind(View itemView, CustomBean data, int position, int size) {
+            CornerImageView imageView = itemView.findViewById(R.id.banner_image);
+            imageView.setRoundCorner(imageView.getContext().getResources().getDimensionPixelOffset(R.dimen.dp_5));
+            Glide.with(imageView).load(data.getImagePath()).placeholder(R.drawable.placeholder).into(imageView);
+        }
+    }
+```
+
+### 5.Use BannerViewPager in Activity or Fragment:
+
+Kotlin:
+
+```
+    private lateinit var mViewPager: BannerViewPager<CustomBean, NetViewHolder>
+    
+    private fun initViewPager() {
+            mBannerViewPager = findViewById(R.id.banner_view)
+            mBannerViewPager.setCanLoop(false)
+                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                .setIndicatorMargin(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dp_40))
+                .setIndicatorGravity(IndicatorGravity.CENTER)
+                .setHolderCreator { NetViewHolder() }
+                .setOnPageChangeListener(
+                    object : OnPageChangeListenerAdapter() {
+                        override fun onPageSelected(position: Int) {
+                            pageSelect(position)
+                        }
+                    }
+                ).setOnPageClickListener {
+                    onPageClick()
+                }
+                .create(res.toList())
+        }
+```    
+
+Java:
+
+```
+    private BannerViewPager<CustomBean, NetViewHolder> mBannerViewPager;
+    ...
+	private void initViewPager() {
+             mBannerViewPager = findViewById(R.id.banner_view);
+             mBannerViewPager.showIndicator(true)
+                .setInterval(3000)
+                .setCanLoop(false)
+                .setAutoPlay(true)
+                .setRoundCorner(getResources().getDimensionPixelOffset(R.dimen.dp_7))
+                .setIndicatorSliderColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))
+                .setIndicatorGravity(IndicatorGravity.END)
+                .setScrollDuration(1000).setHolderCreator(NetViewHolder::new)
+                .setOnPageClickListener(position -> {
+                    CustomBean bannerData = mBannerViewPager.getList().get(position);
+                    Toast.makeText(NetworkBannerActivity.this,
+                            "点击了图片" + position + " " + bannerData.getImageDescription(), Toast.LENGTH_SHORT).show();
+
+                }).create(mList);
+        }
+```
+### 6.startLoop and stopLoop
+
+***If the version you used is later than 2.5.0,you don't need care of startLoop and stopLoop in Activity or Fragment. But the two methods is still public.***
+
+Recommend call stopLoop in onPause() and startLoop in onResume() to improve performance:
+
+```
+    @Override
+    protected void onPause() {
+        if (mBannerViewPager != null)
+                mBannerViewPager.stopLoop();
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mBannerViewPager != null)
+            mBannerViewPager.startLoop();
+    }
+```
+
+### 7.Custom IndicatorView
+
+The example will implement an custom IndicatorView as the follow gif.
+
+| Custom IndicatorView Style|
+|--|
+| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) |
+
+**(1)Custom View and extends BaseIndicatorView**
+
+```
+public class FigureIndicatorView extends BaseIndicatorView {
+
+    private int radius = DpUtils.dp2px(20);
+
+    private int backgroundColor = Color.parseColor("#88FF5252");
+
+    private int textColor = Color.WHITE;
+
+    private int textSize=DpUtils.dp2px(13);
+
+    public FigureIndicatorView(Context context) {
+        this(context, null);
+    }
+
+    public FigureIndicatorView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public FigureIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        mPaint = new Paint();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        setMeasuredDimension(2 * radius, 2 * radius);
+    }
+
+    @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 = currentPosition + 1 + "/" + pageSize;
+        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) {
+        this.radius = radius;
+    }
+
+    @Override
+    public void setBackgroundColor(@ColorInt int backgroundColor) {
+        this.backgroundColor = backgroundColor;
+    }
+
+    public void setTextSize(int textSize) {
+        this.textSize = textSize;
+    }
+
+    public void setTextColor(int textColor) {
+        this.textColor = textColor;
+    }
+}
+```
+**(2)Set custom indicator for BannerViewPager**
+
+```
+    FigureIndicatorView indicatorView = new FigureIndicatorView(mContext);
+    indicatorView.setRadius(getResources().getDimensionPixelOffset(R.dimen.dp_18));
+    indicatorView.setTextSize(getResources().getDimensionPixelOffset(R.dimen.dp_13));
+    indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
+
+    mViewPager.setIndicatorGravity(IndicatorGravity.END)
+              .setIndicatorView(indicatorView)
+              .setHolderCreator(() -> new ImageResourceViewHolder(0))
+              .create(mDrawableList);
+```
+
+## TODO 
+
+ - [x] Optimization and Refactoring IndicatorView(2.0.1)
+
+ - [x] Fix a bug which page frozen sometimes when sliding in version 2.1.0  (2.1.0.1)
+
+ - [x] Set Transform Style Supported(2.1.2)
+
+ - [x] Migrate to Androidx(2.2.0)
+
+ - [x] indicator smooth slide Supported(2.2.2)
+ 
+ - [x] Dash IndicatorView Supported(2.3.+)
+ 
+ - [x] MULTI_PAGE Style Supported(2.4.0)
+ 
+ - [x] Optimize code and improve performance in version 2.4.3
+ 
+ - [x] Refactor Indicator again (2.5.0)
+ - [x] Fix issue #34 which Indicator smooth slide problem(2.6.1).
+ - [ ] Migrate to ViewPager2 (3.0.0)
+
+## FAQ
+
+ **If you have any question regard to BannerViewPager, please scan the QR code and join the QQ group to communicate.**
+
+ ![QQ交流群60902509](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qq_group.png)
+
+
+## <span id="Sponsor"> Sponsor </span>
+
+**开源不易 随心赞赏**
+
+| Alipay | WeChat |
+|--|--|
+| ![Alipay](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_alipay.jpg) |  ![WeChat](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_wechat.png) |
+
+##  More details
+
+[《打造一个丝滑般自动轮播无限循环Android库》](https://juejin.im/post/5d6bce24f265da03db0790d1)
+
+[《BannerViewPager源码解析》](https://juejin.im/post/5d74d3faf265da03b5747015)
+
+[《剖析BannerViewPager中Indicator的设计思想》](https://juejin.im/post/5dda0b6d518825731f569a8c)
+
+## Thanks
+
+[banner](https://github.com/youth5201314/banner)
+
+[Android-ConvenientBanner](https://github.com/saiwu-bigkoo/Android-ConvenientBanner)
+
+[ViewPagerTransforms](https://github.com/ToxicBakery/ViewPagerTransforms)
+
+[玩Android](https://wanandroid.com/)
+
+
+License
+-------
+
+    Copyright 2019 zhpanvip
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+
+
+
+
+

+ 2 - 2
app/build.gradle

@@ -49,13 +49,13 @@ dependencies {
     testImplementation 'junit:junit:4.12'
     implementation 'com.github.bumptech.glide:glide:4.9.0'
     implementation 'com.github.chrisbanes:PhotoView:2.1.0'
-//    implementation 'com.github.zhpanvip:BannerViewPager:2.5.0'
+//    implementation 'com.github.zhpanvip:BannerViewPager:2.7.4'
     implementation project(path: ':bannerview')
     implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
     implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-2'
     implementation project(path: ':ideahttp')
-    implementation 'androidx.core:core-ktx:1.1.0'
+    implementation 'androidx.core:core-ktx:1.2.0'
     implementation 'androidx.cardview:cardview:1.0.0'
     implementation 'androidx.viewpager2:viewpager2:1.0.0'
 }

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

@@ -47,10 +47,10 @@ class MainActivity : AppCompatActivity() {
     private fun setListener() {
         rg_tab?.setOnCheckedChangeListener { _, checkedId ->
             when (checkedId) {
-                R.id.rb_home -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_HOME, false)
-                R.id.rb_add -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_FIND, false)
-                R.id.rb_find -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_INDICATOR, false)
-                R.id.rb_others -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, false)
+                R.id.rb_home -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_HOME, true)
+                R.id.rb_add -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_FIND, true)
+                R.id.rb_find -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_INDICATOR, true)
+                R.id.rb_others -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, true)
             }
         }
     }

+ 2 - 1
app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.kt

@@ -4,6 +4,7 @@ package com.example.zhpan.circleviewpager.activity
 import android.os.Bundle
 
 import com.example.zhpan.circleviewpager.R
+import com.example.zhpan.circleviewpager.adapter.PhotoAdapter
 import com.example.zhpan.circleviewpager.viewholder.PhotoViewHolder
 import com.zhpan.bannerview.BannerViewPager
 
@@ -20,7 +21,7 @@ class PhotoViewActivity : BaseDataActivity() {
         val bannerViewPager = findViewById<BannerViewPager<Int, PhotoViewHolder>>(R.id.viewpager)
         bannerViewPager.setAutoPlay(false)
                 .setCanLoop(false)
-                .setHolderCreator { PhotoViewHolder() }
+                .setAdapter(PhotoAdapter())
                 .create(mDrawableList)
         bannerViewPager.currentItem = 1
     }

+ 18 - 23
app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.kt

@@ -1,26 +1,25 @@
 package com.example.zhpan.circleviewpager.activity
 
-
 import android.animation.AnimatorSet
 import android.animation.ObjectAnimator
 import android.os.Bundle
 import android.view.View
 import android.view.animation.DecelerateInterpolator
-import android.widget.Toast
 import androidx.core.content.ContextCompat
+import androidx.viewpager2.widget.ViewPager2
 import com.example.zhpan.circleviewpager.R
+import com.example.zhpan.circleviewpager.adapter.WelcomeAdapter
 import com.example.zhpan.circleviewpager.bean.CustomBean
 import com.example.zhpan.circleviewpager.viewholder.CustomPageViewHolder
 import com.zhpan.bannerview.BannerViewPager
-import com.zhpan.bannerview.adapter.OnPageChangeListenerAdapter
 import com.zhpan.bannerview.constants.TransformerStyle
-import com.zhpan.bannerview.holder.HolderCreator
 import com.zhpan.bannerview.utils.BannerUtils
+import com.zhpan.idea.utils.ToastUtils
 import com.zhpan.indicator.enums.IndicatorSlideMode
 import kotlinx.android.synthetic.main.activity_welcome.*
 import java.util.*
 
-class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder> {
+class WelcomeActivity : BaseDataActivity() {
 
     private lateinit var mViewPager: BannerViewPager<CustomBean, CustomPageViewHolder>
 
@@ -45,11 +44,12 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
         setContentView(R.layout.activity_welcome)
         setupViewPager()
         updateUI(0)
-        mViewPager.create(data)
     }
 
     private fun setupViewPager() {
         mViewPager = findViewById(R.id.viewpager)
+        val welcomeAdapter = WelcomeAdapter()
+        welcomeAdapter.mOnSubViewClickListener = CustomPageViewHolder.OnSubViewClickListener { _, position -> ToastUtils.show("Logo Clicked,position:$position") }
         mViewPager.setAutoPlay(false)
                 .setCanLoop(false)
                 .setPageTransformerStyle(transforms[Random().nextInt(6)])
@@ -60,13 +60,13 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
                         ContextCompat.getColor(this, R.color.white_alpha_75))
                 .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
                 .setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
-                .setOnPageChangeListener(object : OnPageChangeListenerAdapter() {
+                .setAdapter(welcomeAdapter)
+                .registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
                     override fun onPageSelected(position: Int) {
                         BannerUtils.log("position:$position")
                         updateUI(position)
                     }
                 })
-                .setHolderCreator(this)
                 .create(data)
     }
 
@@ -78,15 +78,19 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
     private fun updateUI(position: Int) {
         tv_describe?.text = des[position]
         val translationAnim = ObjectAnimator.ofFloat(tv_describe, "translationX", -120f, 0f)
-        translationAnim.duration = ANIMATION_DURATION.toLong()
-        translationAnim.interpolator = DecelerateInterpolator()
-        val alphaAnimator1 = ObjectAnimator.ofFloat(tv_describe, "alpha", 0f, 1f)
-        alphaAnimator1.duration = ANIMATION_DURATION.toLong()
+        translationAnim.apply {
+            duration = ANIMATION_DURATION.toLong()
+            interpolator = DecelerateInterpolator()
+        }
+        val alphaAnimator = ObjectAnimator.ofFloat(tv_describe, "alpha", 0f, 1f)
+        alphaAnimator.apply {
+            duration = ANIMATION_DURATION.toLong()
+        }
         val animatorSet = AnimatorSet()
-        animatorSet.playTogether(translationAnim, alphaAnimator1)
+        animatorSet.playTogether(translationAnim, alphaAnimator)
         animatorSet.start()
 
-        if (position == mViewPager.list.size - 1 && btn_start?.visibility == View.GONE) {
+        if (position == mViewPager.data.size - 1 && btn_start?.visibility == View.GONE) {
             btn_start?.visibility = View.VISIBLE
             ObjectAnimator
                     .ofFloat(btn_start, "alpha", 0f, 1f)
@@ -96,16 +100,7 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator<CustomPageViewHolder>
         }
     }
 
-    override fun createViewHolder(): CustomPageViewHolder {
-        val customPageViewHolder = CustomPageViewHolder()
-        customPageViewHolder.setOnSubViewClickListener { _, position ->
-            Toast.makeText(this, "Logo Clicked Item: $position,currentItem:${mViewPager.currentItem}", Toast.LENGTH_SHORT).show()
-        }
-        return customPageViewHolder
-    }
-
     companion object {
-
         private const val ANIMATION_DURATION = 1300
     }
 }

+ 32 - 0
app/src/main/java/com/example/zhpan/circleviewpager/adapter/HomeAdapter.java

@@ -0,0 +1,32 @@
+package com.example.zhpan.circleviewpager.adapter;
+
+import android.view.View;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.net.BannerData;
+import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
+import com.zhpan.bannerview.BaseBannerAdapter;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2020/4/6.
+ *   Description:
+ * </pre>
+ */
+public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
+    @Override
+    protected void onBind(NetViewHolder holder, BannerData data, int position, int pageSize) {
+        holder.bindData(data, position, pageSize);
+    }
+
+    @Override
+    public NetViewHolder createViewHolder(View itemView, int viewType) {
+        return new NetViewHolder(itemView);
+    }
+
+    @Override
+    public int getLayoutId(int viewType) {
+        return R.layout.item_net;
+    }
+}
+

+ 39 - 0
app/src/main/java/com/example/zhpan/circleviewpager/adapter/ImageResourceAdapter.java

@@ -0,0 +1,39 @@
+package com.example.zhpan.circleviewpager.adapter;
+
+import android.view.View;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.zhpan.bannerview.BaseBannerAdapter;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2020/4/5.
+ *   Description:
+ * </pre>
+ */
+public class ImageResourceAdapter extends BaseBannerAdapter<Integer, ImageResourceViewHolder> {
+    private int roundCorner;
+
+    public ImageResourceAdapter(int roundCorner) {
+        this.roundCorner = roundCorner;
+    }
+
+
+    @Override
+    protected void onBind(ImageResourceViewHolder holder, Integer data, int position, int pageSize) {
+        holder.bindData(data, position, pageSize);
+    }
+
+    @Override
+    public ImageResourceViewHolder createViewHolder(View itemView, int viewType) {
+        ImageResourceViewHolder viewHolder = new ImageResourceViewHolder(itemView);
+        viewHolder.setRoundCorner(roundCorner);
+        return viewHolder;
+    }
+
+    @Override
+    public int getLayoutId(int viewType) {
+        return R.layout.item_slide_mode;
+    }
+}

+ 28 - 0
app/src/main/java/com/example/zhpan/circleviewpager/adapter/PhotoAdapter.kt

@@ -0,0 +1,28 @@
+package com.example.zhpan.circleviewpager.adapter
+
+import android.view.View
+import com.example.zhpan.circleviewpager.R
+import com.example.zhpan.circleviewpager.viewholder.PhotoViewHolder
+import com.zhpan.bannerview.BaseBannerAdapter
+
+
+/**
+ * <pre>
+ *   Created by zhpan on 2020/4/5.
+ *   Description:
+ * </pre>
+ */
+class PhotoAdapter : BaseBannerAdapter<Int, PhotoViewHolder>() {
+    override fun onBind(holder: PhotoViewHolder?, data: Int?, position: Int, pageSize: Int) {
+        holder?.bindData(data, position, pageSize)
+    }
+
+    override fun createViewHolder(itemView: View?, viewType: Int): PhotoViewHolder {
+        return PhotoViewHolder(itemView!!)
+    }
+
+    override fun getLayoutId(viewType: Int): Int {
+        return R.layout.item_photo_view;
+    }
+
+}

+ 35 - 0
app/src/main/java/com/example/zhpan/circleviewpager/adapter/WelcomeAdapter.kt

@@ -0,0 +1,35 @@
+package com.example.zhpan.circleviewpager.adapter
+
+import android.view.View
+import android.widget.ImageView
+import androidx.recyclerview.widget.RecyclerView
+import com.example.zhpan.circleviewpager.R
+
+import com.example.zhpan.circleviewpager.bean.CustomBean
+import com.example.zhpan.circleviewpager.viewholder.CustomPageViewHolder
+import com.zhpan.bannerview.BaseBannerAdapter
+
+/**
+ * <pre>
+ * Created by zhpan on 2020/4/5.
+ * Description:
+</pre> *
+ */
+class WelcomeAdapter : BaseBannerAdapter<CustomBean, CustomPageViewHolder>() {
+
+    var mOnSubViewClickListener: CustomPageViewHolder.OnSubViewClickListener? = null
+
+    override fun onBind(holder: CustomPageViewHolder, data: CustomBean, position: Int, pageSize: Int) {
+        holder.bindData(data, position, pageSize)
+    }
+
+    override fun createViewHolder(itemView: View, viewType: Int): CustomPageViewHolder? {
+        val customPageViewHolder = CustomPageViewHolder(itemView)
+        customPageViewHolder.setOnSubViewClickListener(mOnSubViewClickListener)
+        return customPageViewHolder
+    }
+
+    override fun getLayoutId(viewType: Int): Int {
+        return R.layout.item_custom_view
+    }
+}

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

@@ -9,9 +9,11 @@ import android.widget.Toast;
 
 import androidx.recyclerview.widget.DividerItemDecoration;
 import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.viewpager2.widget.ViewPager2;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.adapter.ArticleAdapter;
+import com.example.zhpan.circleviewpager.adapter.HomeAdapter;
 import com.example.zhpan.circleviewpager.bean.ArticleWrapper;
 import com.example.zhpan.circleviewpager.bean.DataWrapper;
 import com.example.zhpan.circleviewpager.net.BannerData;
@@ -21,7 +23,6 @@ import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.adapter.OnPageChangeListenerAdapter;
 import com.zhpan.idea.net.common.ResponseObserver;
 import com.zhpan.idea.utils.LogUtils;
 import com.zhpan.idea.utils.RxUtil;
@@ -39,6 +40,7 @@ import io.reactivex.schedulers.Schedulers;
  */
 public class HomeFragment extends BaseFragment {
 
+
     private BannerViewPager<BannerData, NetViewHolder> mViewPager;
     private CustomRecyclerView recyclerView;
     private ArticleAdapter articleAdapter;
@@ -110,7 +112,7 @@ public class HomeFragment extends BaseFragment {
                 .subscribe(new ResponseObserver<DataWrapper>() {
                     @Override
                     public void onSuccess(DataWrapper response) {
-                        mViewPager.create(response.getDataBeanList());
+                        mViewPager.setData(response.getDataBeanList());
                         articleAdapter.setData(response.getArticleList());
                         if (response.getDataBeanList().size() > 0) {
                             mTvTitle.setText(response.getDataBeanList().get(0).getTitle());
@@ -136,20 +138,18 @@ public class HomeFragment extends BaseFragment {
 
     private void initBanner() {
         mViewPager
-                .setAutoPlay(true)
-                .setCanLoop(true)
                 .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setInterval(5000)
                 .setScrollDuration(1200)
                 .setIndicatorSliderRadius(getResources().getDimensionPixelSize(R.dimen.dp_3))
                 .setIndicatorView(mIndicatorView)// 这里为了设置标题故用了自定义Indicator,如果无需标题则没必要添加此行代码
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
-                .setHolderCreator(NetViewHolder::new)
-                .setOnPageChangeListener(new OnPageChangeListenerAdapter() {
+                .setAdapter(new HomeAdapter())
+                .registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                     @Override
                     public void onPageSelected(int position) {
                         super.onPageSelected(position);
-                        BannerData bannerData = mViewPager.getList().get(position);
+                        BannerData bannerData = mViewPager.getData().get(position);
                         mTvTitle.setText(bannerData.getTitle());
                     }
                 })
@@ -157,7 +157,7 @@ public class HomeFragment extends BaseFragment {
     }
 
     private void onPageClicked(int position) {
-        BannerData bannerData = mViewPager.getList().get(position);
+        BannerData bannerData = mViewPager.getData().get(position);
         Toast.makeText(getMContext(), "position:" + position + " " + bannerData.getTitle() + "currentItem:" + mViewPager.getCurrentItem(), Toast.LENGTH_SHORT).show();
     }
 

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

@@ -6,6 +6,7 @@ import android.widget.RadioButton;
 import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.adapter.ImageResourceAdapter;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.constants.IndicatorGravity;
@@ -33,6 +34,10 @@ public class IndicatorFragment extends BaseFragment {
         return R.layout.fragment_indicator;
     }
 
+    public static IndicatorFragment getInstance() {
+        return new IndicatorFragment();
+    }
+
     @Override
     protected void initTitle() {
 
@@ -61,14 +66,11 @@ public class IndicatorFragment extends BaseFragment {
         mRadioGroupMode = view.findViewById(R.id.rg_slide_mode);
         mViewPager = view.findViewById(R.id.banner_view);
         mViewPager.setIndicatorSliderGap(BannerUtils.dp2px(6))
-                .setRoundCorner(BannerUtils.dp2px(6))
-                .setHolderCreator(() -> new ImageResourceViewHolder(0));
+                .setAdapter(new ImageResourceAdapter(0))
+                .setRoundCorner(BannerUtils.dp2px(6));
         initRadioGroup();
     }
 
-    public static IndicatorFragment getInstance() {
-        return new IndicatorFragment();
-    }
 
     private void initRadioGroup() {
         mRadioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> checkedChange(mCheckId = checkedId));
@@ -123,7 +125,6 @@ public class IndicatorFragment extends BaseFragment {
         mViewPager.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
                 .setIndicatorGravity(IndicatorGravity.CENTER)
                 .setIndicatorSliderGap(BannerUtils.dp2px(4))
-                .setPageMargin(0)
                 .setIndicatorSlideMode(mSlideMode)
                 .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_4))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
@@ -137,7 +138,6 @@ public class IndicatorFragment extends BaseFragment {
                 .setIndicatorGravity(IndicatorGravity.CENTER)
                 .setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_6))
                 .setIndicatorHeight(getResources().getDimensionPixelOffset(R.dimen.dp_4))
-                .setPageMargin(0)
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setIndicatorSliderRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4)).create(getMDrawableList());
@@ -151,7 +151,6 @@ public class IndicatorFragment extends BaseFragment {
                 .setIndicatorGravity(IndicatorGravity.CENTER)
                 .setIndicatorSlideMode(mSlideMode)
                 .setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_3))
-                .setPageMargin(0)
                 .setIndicatorSliderWidth(normalWidth, checkedWidth)
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .create(getMDrawableList());

+ 16 - 19
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java

@@ -9,6 +9,7 @@ import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
+import com.example.zhpan.circleviewpager.adapter.ImageResourceAdapter;
 import com.example.zhpan.circleviewpager.view.DrawableIndicator;
 import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
@@ -24,7 +25,6 @@ import com.zhpan.indicator.enums.IndicatorSlideMode;
 import java.lang.reflect.Field;
 import java.util.Random;
 
-
 /**
  * Created by zhpan on 2018/7/24.
  */
@@ -35,6 +35,10 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
     private RadioButton radioButton;
     private IndicatorView mIndicatorView;
 
+    public static OthersFragment getInstance() {
+        return new OthersFragment();
+    }
+
     @Override
     protected int getLayout() {
         return R.layout.fragment_others;
@@ -71,23 +75,17 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
         view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
         mViewPager.setIndicatorSliderGap(BannerUtils.dp2px(6))
                 .setRoundCorner(BannerUtils.dp2px(6))
-                .setOnPageClickListener(new BannerViewPager.OnPageClickListener() {
-                    @Override
-                    public void onPageClick(int position) {
-                        ToastUtils.show("position:" + position);
-                        int currentItem = mViewPager.getCurrentItem();
-                        LogUtils.e("currentItem:", currentItem + "");
-                    }
+                .setOnPageClickListener(position -> {
+                    ToastUtils.show("position:" + position);
+                    int currentItem = mViewPager.getCurrentItem();
+                    LogUtils.e("currentItem:", currentItem + "");
                 })
-//                .setOnPageClickListener(position -> ToastUtils.show("Position:" + position))
-                .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
-                .setHolderCreator(() -> new ImageResourceViewHolder(0));
+                .setAdapter(new ImageResourceAdapter(0))
+                .setOnPageClickListener(position -> ToastUtils.show("Position:" + position))
+                .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color));
         initRadioGroup();
     }
 
-    public static OthersFragment getInstance() {
-        return new OthersFragment();
-    }
 
     private void initRadioGroup() {
         radioGroupStyle.setVisibility(View.VISIBLE);
@@ -153,10 +151,8 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
         mViewPager.setAutoPlay(false).setCanLoop(true)
                 .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
                 .setIndicatorVisibility(View.VISIBLE)
-                .setPageMargin(BannerUtils.dp2px(20))
                 .setIndicatorGravity(IndicatorGravity.END)
-                .setIndicatorView(setupIndicatorView())
-                .setHolderCreator(() -> new ImageResourceViewHolder(0)).create(getMDrawableList());
+                .setIndicatorView(setupIndicatorView()).create(getMDrawableList());
     }
 
     /**
@@ -172,9 +168,9 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
 
     private void updateData() {
         //  生成[-1,3]整数
-        initData(0);
+        initData(new Random().nextInt(5) - 1);
         ToastUtils.show("size=" + getMDrawableList().size());
-        mViewPager.create(getMDrawableList());
+        mViewPager.setData(getMDrawableList());
     }
 
     @Override
@@ -197,4 +193,5 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
             e.printStackTrace();
         }
     }
+
 }

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

@@ -6,6 +6,7 @@ import android.widget.RadioButton;
 import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.adapter.ImageResourceAdapter;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.annotation.APageStyle;
@@ -18,7 +19,6 @@ import com.zhpan.indicator.enums.IndicatorSlideMode;
  * Created by zhpan on 2018/7/24.
  */
 public class PageFragment extends BaseFragment {
-
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     private RadioGroup mRadioGroupPageStyle;
     private RadioButton radioButton;
@@ -28,6 +28,11 @@ public class PageFragment extends BaseFragment {
         return R.layout.fragment_find;
     }
 
+
+    public static PageFragment getInstance() {
+        return new PageFragment();
+    }
+
     @Override
     protected void initTitle() {
 
@@ -56,20 +61,14 @@ public class PageFragment extends BaseFragment {
         radioButton = view.findViewById(R.id.rb_multi_page);
         mViewPager
                 .setIndicatorSlideMode(IndicatorSlideMode.NORMAL)
-                .setHolderCreator(() -> new ImageResourceViewHolder(getResources().getDimensionPixelOffset(R.dimen.dp_5)))
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
-                .setIndicatorSliderRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4),getResources().getDimensionPixelOffset(R.dimen.dp_5))
+                .setIndicatorSliderRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4), getResources().getDimensionPixelOffset(R.dimen.dp_5))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
+                .setAdapter(new ImageResourceAdapter(getResources().getDimensionPixelOffset(R.dimen.dp_6)))
                 .setInterval(5000);
         initRadioGroup();
     }
 
-
-    public static PageFragment getInstance() {
-        return new PageFragment();
-    }
-
-
     private void initRadioGroup() {
         mRadioGroupPageStyle.setOnCheckedChangeListener((group, checkedId) -> {
             switch (checkedId) {
@@ -93,7 +92,7 @@ public class PageFragment extends BaseFragment {
     private void setupBanner(@APageStyle int pageStyle) {
         mViewPager
                 .setPageMargin(getResources().getDimensionPixelOffset(R.dimen.dp_10))
-                .setRevealWidth(getResources().getDimensionPixelOffset(R.dimen.dp_10))
+                .setRevealWidth(getResources().getDimensionPixelOffset(R.dimen.dp_20))
                 .setPageStyle(pageStyle)
                 .create(getMDrawableList());
     }
@@ -104,7 +103,6 @@ public class PageFragment extends BaseFragment {
                 .setPageMargin(getResources().getDimensionPixelOffset(R.dimen.dp_15))
                 .setRevealWidth(BannerUtils.dp2px(0))
                 .setPageStyle(PageStyle.MULTI_PAGE)
-                .setHolderCreator(() -> new ImageResourceViewHolder(getResources().getDimensionPixelOffset(R.dimen.dp_5)))
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setInterval(5000).create(getMDrawableList());

+ 13 - 13
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/CustomPageViewHolder.java

@@ -4,29 +4,29 @@ import android.animation.ObjectAnimator;
 import android.view.View;
 import android.widget.ImageView;
 
+import androidx.annotation.NonNull;
+
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.bean.CustomBean;
-import com.zhpan.bannerview.holder.ViewHolder;
+import com.zhpan.bannerview.BaseViewHolder;
+
+public class CustomPageViewHolder extends BaseViewHolder<CustomBean> {
 
-public class CustomPageViewHolder implements ViewHolder<CustomBean> {
     private OnSubViewClickListener mOnSubViewClickListener;
 
-    @Override
-    public int getLayoutId() {
-        return R.layout.item_custom_view;
+    public CustomPageViewHolder(@NonNull View itemView) {
+        super(itemView);
     }
 
     @Override
-    public void onBind(View itemView, CustomBean data, int position, int size) {
-        ImageView mImageView = itemView.findViewById(R.id.banner_image);
-        ImageView  mImageStart = itemView.findViewById(R.id.iv_logo);
-
-        mImageView.setImageResource(data.getImageRes());
-        mImageStart.setOnClickListener(view -> {
+    public void bindData(CustomBean data, int position, int pageSize) {
+        ImageView imageStart = findView(R.id.iv_logo);
+        setImageResource(R.id.banner_image, data.getImageRes());
+        setOnClickListener(R.id.iv_logo, view -> {
             if (null != mOnSubViewClickListener)
-                mOnSubViewClickListener.onViewClick(view, position);
+                mOnSubViewClickListener.onViewClick(view, getAdapterPosition());
         });
-        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageStart, "alpha", 0, 1);
+        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(imageStart, "alpha", 0, 1);
         alphaAnimator.setDuration(1500);
         alphaAnimator.start();
     }

+ 12 - 12
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/ImageResourceViewHolder.java

@@ -2,9 +2,11 @@ package com.example.zhpan.circleviewpager.viewholder;
 
 import android.view.View;
 
+import androidx.annotation.NonNull;
+
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.view.CornerImageView;
-import com.zhpan.bannerview.holder.ViewHolder;
+import com.zhpan.bannerview.BaseViewHolder;
 
 /**
  * <pre>
@@ -12,24 +14,22 @@ import com.zhpan.bannerview.holder.ViewHolder;
  *   Description:
  * </pre>
  */
-public class ImageResourceViewHolder implements ViewHolder<Integer> {
+public class ImageResourceViewHolder extends BaseViewHolder<Integer> {
 
     private int roundCorner;
 
-    public ImageResourceViewHolder(int roundCorner) {
-        this.roundCorner = roundCorner;
+    public ImageResourceViewHolder(@NonNull View itemView) {
+        super(itemView);
+        CornerImageView imageView = findView(R.id.banner_image);
+        imageView.setRoundCorner(roundCorner);
     }
 
     @Override
-    public int getLayoutId() {
-        return R.layout.item_slide_mode;
+    public void bindData(Integer data, int position, int pageSize) {
+        setImageResource(R.id.banner_image, data);
     }
 
-    @Override
-    public void onBind(View itemView, Integer data, int position, int size) {
-        CornerImageView imageView = itemView.findViewById(R.id.banner_image);
-        imageView.setImageResource(data);
-        imageView.setRoundCorner(roundCorner);
+    public void setRoundCorner(int roundCorner) {
+        this.roundCorner = roundCorner;
     }
-
 }

+ 10 - 8
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java

@@ -2,11 +2,13 @@ package com.example.zhpan.circleviewpager.viewholder;
 
 import android.view.View;
 
+import androidx.annotation.NonNull;
+
 import com.bumptech.glide.Glide;
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.net.BannerData;
 import com.example.zhpan.circleviewpager.view.CornerImageView;
-import com.zhpan.bannerview.holder.ViewHolder;
+import com.zhpan.bannerview.BaseViewHolder;
 import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
@@ -15,17 +17,17 @@ import com.zhpan.bannerview.utils.BannerUtils;
  *   Description:
  * </pre>
  */
-public class NetViewHolder implements ViewHolder<BannerData> {
+public class NetViewHolder extends BaseViewHolder<BannerData> {
 
-    @Override
-    public int getLayoutId() {
-        return R.layout.item_net;
+    public NetViewHolder(@NonNull View itemView) {
+        super(itemView);
+        CornerImageView imageView = findView(R.id.banner_image);
+        imageView.setRoundCorner(BannerUtils.dp2px(0));
     }
 
     @Override
-    public void onBind(View itemView, BannerData data, int position, int size) {
-        CornerImageView imageView = itemView.findViewById(R.id.banner_image);
-        imageView.setRoundCorner(BannerUtils.dp2px(0));
+    public void bindData(BannerData data, int position, int pageSize) {
+        CornerImageView imageView = findView(R.id.banner_image);
         Glide.with(imageView).load(data.getImagePath()).placeholder(R.drawable.placeholder).into(imageView);
     }
 }

+ 8 - 10
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/PhotoViewHolder.kt

@@ -1,26 +1,24 @@
 package com.example.zhpan.circleviewpager.viewholder
 
 import android.view.View
+import android.widget.ImageView
 import android.widget.Toast
 
 import com.example.zhpan.circleviewpager.R
 import com.github.chrisbanes.photoview.PhotoView
-import com.zhpan.bannerview.holder.ViewHolder
+import com.zhpan.bannerview.BaseViewHolder
 
 /**
  * Created by zhpan on 2017/10/30.
  * Description:
  */
 
-class PhotoViewHolder : ViewHolder<Int> {
+class PhotoViewHolder(itemView: View) : BaseViewHolder<Int>(itemView) {
 
-    override fun getLayoutId(): Int {
-        return R.layout.item_photo_view
-    }
-
-    override fun onBind(itemView: View, data: Int?, position: Int, size: Int) {
-        val imageView = itemView.findViewById<PhotoView>(R.id.banner_image)
-        imageView.setImageResource(data!!)
-        imageView.setOnClickListener { v -> Toast.makeText(itemView.context, "$position  页面数$size", Toast.LENGTH_SHORT).show() }
+    override fun bindData(data: Int?, position: Int, size: Int) {
+        setImageResource(R.id.banner_image, data!!)
+        setOnClickListener(R.id.banner_image) {
+            Toast.makeText(itemView.context, "$adapterPosition  页面数$size", Toast.LENGTH_SHORT).show()
+        }
     }
 }

+ 1 - 1
app/src/main/res/layout/item_net.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="match_parent">
 
     <com.example.zhpan.circleviewpager.view.CornerImageView
         android:id="@+id/banner_image"

+ 1 - 1
app/src/main/res/layout/item_slide_mode.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="match_parent">
 
     <com.example.zhpan.circleviewpager.view.CornerImageView
         android:id="@+id/banner_image"

+ 1 - 1
app/src/main/res/layout/item_view.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="match_parent">
 
     <ImageView
         android:id="@+id/banner_image"

+ 4 - 75
bannerview/build.gradle

@@ -1,6 +1,7 @@
 apply plugin: 'com.android.library'
 apply plugin: 'com.github.dcendents.android-maven'
-apply plugin: 'com.jfrog.bintray'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
 android {
     compileSdkVersion 28
 
@@ -31,78 +32,6 @@ dependencies {
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
     implementation 'androidx.appcompat:appcompat:1.1.0'
     api 'com.github.zhpanvip:viewpagerindicator:1.0.0'
+    implementation 'androidx.viewpager2:viewpager2:1.0.0'
+    implementation 'androidx.core:core-ktx:1.2.0'
 }
-
-version = "2.6.4"
-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,一般填你唯一的包名
-install {
-    repositories.mavenInstaller {
-        // This generates POM.xml with proper parameters
-        pom {
-            project {
-                packaging 'aar'
-                // Add your description here
-                description 'Banner ViewPager for Android'
-                name 'Banner ViewPager for Android'  //项目描述
-                url siteUrl
-                // Set your license
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer { // 开发者信息
-                        id 'zhpan'
-                        name 'zhangpan'
-                        email 'zhpanvip@outlook.com'
-                    }
-                }
-                scm {
-                    connection gitUrl
-                    developerConnection gitUrl
-                    url siteUrl
-                }
-            }
-        }
-    }
-}
-task sourcesJar(type: Jar) {
-    from android.sourceSets.main.java.srcDirs
-    classifier = 'sources'
-}
-task javadoc(type: Javadoc) {
-    failOnError false
-}
-
-task javadocJar(type: Jar, dependsOn: javadoc) {
-    classifier = 'javadoc'
-    from javadoc.destinationDir
-}
-artifacts {
-    archives javadocJar
-    archives sourcesJar
-}
-Properties properties = new Properties()
-// 加载本地配置
-properties.load(project.rootProject.file('local.properties').newDataInputStream())
-bintray {
-    user = properties.getProperty("bintray.user")
-    key = properties.getProperty("bintray.apikey")
-    configurations = ['archives']
-    pkg {
-        repo = "CircleViewPager"  //发布到Bintray的那个仓库里,默认账户有四个库,我们这里上传到maven库
-        name = "bannerview"  //发布到Bintray上的项目名字
-        websiteUrl = siteUrl
-        vcsUrl = gitUrl
-        licenses = ["Apache-2.0"]
-        publish = true
-    }
-}
-
-//提交命令:gradlew bintrayUpload
-
-// mac ./gradlew bintrayUpload  没有权限使用申请 chmod +x gradlew

+ 231 - 223
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -6,8 +6,10 @@ import android.os.Handler;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.Nullable;
-import androidx.viewpager.widget.PagerAdapter;
-import androidx.viewpager.widget.ViewPager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.CompositePageTransformer;
+import androidx.viewpager2.widget.MarginPageTransformer;
+import androidx.viewpager2.widget.ViewPager2;
 
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -22,14 +24,11 @@ import com.zhpan.bannerview.annotation.Visibility;
 import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
+import com.zhpan.bannerview.transform.OverlapPageTransformer;
+import com.zhpan.bannerview.transform.PageTransformerFactory;
 import com.zhpan.bannerview.transform.ScaleInTransformer;
 import com.zhpan.bannerview.utils.BannerUtils;
-import com.zhpan.bannerview.adapter.BannerPagerAdapter;
-import com.zhpan.bannerview.holder.HolderCreator;
-import com.zhpan.bannerview.holder.ViewHolder;
 import com.zhpan.bannerview.provider.ViewStyleSetter;
-import com.zhpan.bannerview.transform.PageTransformerFactory;
-import com.zhpan.bannerview.view.CatchViewPager;
 import com.zhpan.indicator.IndicatorView;
 import com.zhpan.indicator.annotation.AIndicatorSlideMode;
 import com.zhpan.indicator.annotation.AIndicatorStyle;
@@ -37,7 +36,7 @@ import com.zhpan.indicator.base.IIndicator;
 
 import java.util.List;
 
-import static com.zhpan.bannerview.adapter.BannerPagerAdapter.MAX_VALUE;
+import static com.zhpan.bannerview.BaseBannerAdapter.MAX_VALUE;
 import static com.zhpan.bannerview.constants.IndicatorGravity.CENTER;
 import static com.zhpan.bannerview.constants.IndicatorGravity.END;
 import static com.zhpan.bannerview.constants.IndicatorGravity.START;
@@ -47,8 +46,7 @@ import static com.zhpan.bannerview.transform.ScaleInTransformer.MAX_SCALE;
 /**
  * Created by zhpan on 2017/3/28.
  */
-public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout implements
-        ViewPager.OnPageChangeListener {
+public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayout {
 
     private int currentPosition;
 
@@ -60,14 +58,16 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private RelativeLayout mIndicatorLayout;
 
-    private CatchViewPager mViewPager;
+    private ViewPager2 mViewPager;
 
     private BannerManager mBannerManager;
 
-    private HolderCreator<VH> holderCreator;
-
     private Handler mHandler = new Handler();
 
+    private BaseBannerAdapter<T, VH> mBannerPagerAdapter;
+
+    private ViewPager2.OnPageChangeCallback onPageChangeCallback;
+
     private Runnable mRunnable = new Runnable() {
         @Override
         public void run() {
@@ -77,6 +77,55 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private int startX, startY;
 
+    private CompositePageTransformer mCompositePageTransformer;
+
+    private MarginPageTransformer mMarginPageTransformer;
+
+    private ViewPager2.PageTransformer mPageTransformer;
+
+    private ViewPager2.OnPageChangeCallback mOnPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
+            int listSize = mBannerPagerAdapter.getListSize();
+            int realPosition = BannerUtils.getRealPosition(isCanLoop(), position, listSize);
+            if (listSize > 0) {
+                if (onPageChangeCallback != null) {
+                    onPageChangeCallback.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+                }
+                if (mIndicatorView != null) {
+                    mIndicatorView.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+                }
+            }
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            super.onPageSelected(position);
+            int size = mBannerPagerAdapter.getListSize();
+            currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
+            if (size > 0 && isCanLoop() && position == 0 || position == MAX_VALUE - 1) {
+                setCurrentItem(currentPosition, false);
+            }
+            if (onPageChangeCallback != null)
+                onPageChangeCallback.onPageSelected(currentPosition);
+            if (mIndicatorView != null) {
+                mIndicatorView.onPageSelected(currentPosition);
+            }
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+            super.onPageScrollStateChanged(state);
+            if (mIndicatorView != null) {
+                mIndicatorView.onPageScrollStateChanged(state);
+            }
+            if (onPageChangeCallback != null) {
+                onPageChangeCallback.onPageScrollStateChanged(state);
+            }
+        }
+    };
+
     public BannerViewPager(Context context) {
         this(context, null);
     }
@@ -91,6 +140,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void init(Context context, AttributeSet attrs) {
+        mCompositePageTransformer = new CompositePageTransformer();
         mBannerManager = new BannerManager();
         mBannerManager.initAttrs(context, attrs);
         initView();
@@ -100,6 +150,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         inflate(getContext(), R.layout.bvp_layout, this);
         mViewPager = findViewById(R.id.vp_main);
         mIndicatorLayout = findViewById(R.id.bvp_layout_indicator);
+        mViewPager.setPageTransformer(mCompositePageTransformer);
     }
 
     @Override
@@ -124,27 +175,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
                 startY = (int) ev.getY();
                 getParent().requestDisallowInterceptTouchEvent(true);
                 break;
-            case MotionEvent.ACTION_MOVE:
-                int endX = (int) ev.getX();
-                int endY = (int) ev.getY();
-                int disX = Math.abs(endX - startX);
-                int disY = Math.abs(endY - startY);
-                if (disX > disY) {
-                    if (!isCanLoop()) {
-                        if (currentPosition == 0 && endX - startX > 0) {
-                            getParent().requestDisallowInterceptTouchEvent(false);
-                        } else if (currentPosition == getList().size() - 1 && endX - startX < 0) {
-                            getParent().requestDisallowInterceptTouchEvent(false);
-                        } else {
-                            getParent().requestDisallowInterceptTouchEvent(true);
-                        }
-                    } else {
-                        getParent().requestDisallowInterceptTouchEvent(true);
-                    }
-                } else if (2 * disX < disY) {
-                    getParent().requestDisallowInterceptTouchEvent(false);
-                }
-                break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
                 setLooping(false);
@@ -156,44 +186,76 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
                 startLoop();
                 break;
         }
+        int orientation = mBannerManager.bannerOptions().getOrientation();
+        if (orientation == ViewPager2.ORIENTATION_VERTICAL) {
+            dispatchVerticalTouchEvent(ev);
+        } else if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
+            dispatchHorizontalTouchEvent(ev);
+        }
         return super.dispatchTouchEvent(ev);
     }
 
-    @Override
-    public void onPageSelected(int position) {
-        int size = mBannerPagerAdapter.getListSize();
-        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
-        if (size > 0 && isCanLoop() && position == 0 || position == MAX_VALUE - 1) {
-            setCurrentItem(currentPosition, false);
-        }
-        if (mOnPageChangeListener != null)
-            mOnPageChangeListener.onPageSelected(currentPosition);
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageSelected(currentPosition);
+    private void dispatchHorizontalTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                getParent().requestDisallowInterceptTouchEvent(true);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                onActionMove(ev);
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                getParent().requestDisallowInterceptTouchEvent(false);
+                break;
+            case MotionEvent.ACTION_OUTSIDE:
+                break;
         }
     }
 
-    @Override
-    public void onPageScrollStateChanged(int state) {
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageScrollStateChanged(state);
-        }
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrollStateChanged(state);
+    private void dispatchVerticalTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                getParent().requestDisallowInterceptTouchEvent(false);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                int endX = (int) ev.getX();
+                int endY = (int) ev.getY();
+                int disX = Math.abs(endX - startX);
+                int disY = Math.abs(endY - startY);
+                if (disX > disY) {
+                    getParent().requestDisallowInterceptTouchEvent(false);
+                } else {
+                    getParent().requestDisallowInterceptTouchEvent(true);
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                getParent().requestDisallowInterceptTouchEvent(true);
+                break;
+            case MotionEvent.ACTION_OUTSIDE:
+                break;
         }
     }
 
-    @Override
-    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        int listSize = mBannerPagerAdapter.getListSize();
-        int realPosition = BannerUtils.getRealPosition(isCanLoop(), position, listSize);
-        if (listSize > 0) {
-            if (mOnPageChangeListener != null) {
-                mOnPageChangeListener.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
-            }
-            if (mIndicatorView != null) {
-                mIndicatorView.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+    private void onActionMove(MotionEvent ev) {
+        int endX = (int) ev.getX();
+        int endY = (int) ev.getY();
+        int disX = Math.abs(endX - startX);
+        int disY = Math.abs(endY - startY);
+        if (disX > disY) {
+            if (!isCanLoop()) {
+                if (currentPosition == 0 && endX - startX > 0) {
+                    getParent().requestDisallowInterceptTouchEvent(false);
+                } else if (currentPosition == getData().size() - 1 && endX - startX < 0) {
+                    getParent().requestDisallowInterceptTouchEvent(false);
+                } else {
+                    getParent().requestDisallowInterceptTouchEvent(true);
+                }
+            } else {
+                getParent().requestDisallowInterceptTouchEvent(true);
             }
+        } else if (2 * disX < disY) {
+            getParent().requestDisallowInterceptTouchEvent(false);
         }
     }
 
@@ -205,7 +267,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    private void initBannerData(List<T> list) {
+    private void initBannerData() {
+        List<T> list = mBannerPagerAdapter.getData();
         if (list != null) {
             setIndicatorValues(list);
             setupViewPager(list);
@@ -274,42 +337,28 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void setupViewPager(List<T> list) {
-        if (holderCreator == null) {
-            throw new NullPointerException("You must set HolderCreator for BannerViewPager");
+        if (mBannerPagerAdapter == null) {
+            throw new NullPointerException("You must set adapter for BannerViewPager");
         }
         currentPosition = 0;
-        mViewPager.setAdapter(getPagerAdapter(list));
+        mBannerPagerAdapter.setCanLoop(isCanLoop());
+        mBannerPagerAdapter.setPageClickListener(mOnPageClickListener);
+        mViewPager.setAdapter(mBannerPagerAdapter);
         if (list.size() > 1 && isCanLoop()) {
-            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1);
+            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1, false);
         }
-        mViewPager.removeOnPageChangeListener(this);
-        mViewPager.addOnPageChangeListener(this);
+        mViewPager.unregisterOnPageChangeCallback(mOnPageChangeCallback);
+        mViewPager.registerOnPageChangeCallback(mOnPageChangeCallback);
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
-        mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
-        mViewPager.disableTouchScroll(bannerOptions.isDisableTouchScroll());
-        mViewPager.setFirstLayout(true);
+        mViewPager.setOrientation(bannerOptions.getOrientation());
+        mViewPager.setUserInputEnabled(bannerOptions.isUserInputEnabled());
+        //  TODO Support Scroll Duration
+//        mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
         mViewPager.setOffscreenPageLimit(bannerOptions.getOffScreenPageLimit());
         initPageStyle();
         startLoop();
     }
 
-    private BannerPagerAdapter<T, VH> mBannerPagerAdapter;
-
-    private PagerAdapter getPagerAdapter(List<T> list) {
-        mBannerPagerAdapter =
-                new BannerPagerAdapter<>(list, holderCreator);
-        mBannerPagerAdapter.setCanLoop(isCanLoop());
-        mBannerPagerAdapter.setPageClickListener(new BannerPagerAdapter.PageClickListener() {
-            @Override
-            public void onPageClick(int position) {
-                if (mOnPageClickListener != null) {
-                    mOnPageClickListener.onPageClick(position);
-                }
-            }
-        });
-        return mBannerPagerAdapter;
-    }
-
     private void initPageStyle() {
         switch (mBannerManager.bannerOptions().getPageStyle()) {
             case PageStyle.MULTI_PAGE:
@@ -325,16 +374,25 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void setMultiPageStyle(boolean overlap, float scale) {
-        setClipChildren(false);
-        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mViewPager.getLayoutParams();
+        RecyclerView recyclerView = (RecyclerView) mViewPager.getChildAt(0);
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
-        params.leftMargin = bannerOptions.getPageMargin() + bannerOptions.getRevealWidth();
-        params.rightMargin = params.leftMargin;
-        mViewPager.setOverlapStyle(overlap);
-        mViewPager.setPageMargin(overlap ? -bannerOptions.getPageMargin() : bannerOptions.getPageMargin());
-        int offScreenPageLimit = bannerOptions.getOffScreenPageLimit();
-        mViewPager.setOffscreenPageLimit(Math.max(offScreenPageLimit, 2));
-        setPageTransformer(new ScaleInTransformer(scale));
+        int orientation = bannerOptions.getOrientation();
+        int padding = bannerOptions.getPageMargin() + bannerOptions.getRevealWidth();
+        if (orientation == ViewPager2.ORIENTATION_HORIZONTAL)
+            recyclerView.setPadding(padding, 0, padding, 0);
+        else if (orientation == ViewPager2.ORIENTATION_VERTICAL) {
+            recyclerView.setPadding(0, padding, 0, padding);
+        }
+        recyclerView.setClipToPadding(false);
+        if (mPageTransformer != null) {
+            mCompositePageTransformer.removeTransformer(mPageTransformer);
+        }
+        if (overlap && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            mPageTransformer = new OverlapPageTransformer(orientation, scale, scale, 0, 0);
+        } else {
+            mPageTransformer = new ScaleInTransformer(scale);
+        }
+        addPageTransformer(mPageTransformer);
     }
 
     private int getInterval() {
@@ -360,8 +418,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     /**
      * @return BannerViewPager data set
      */
-    public List<T> getList() {
-        return mBannerPagerAdapter.getList();
+    public List<T> getData() {
+        return mBannerPagerAdapter.getData();
     }
 
     /**
@@ -385,18 +443,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    /**
-     * Must set HolderCreator for BannerViewPager
-     * <p>
-     * In BannerPagerAdapter, the HolderCreator will return custom ViewHolder,then get item layout id by ViewHolder.
-     *
-     * @param holderCreator HolderCreator
-     */
-    public BannerViewPager<T, VH> setHolderCreator(HolderCreator<VH> holderCreator) {
-        this.holderCreator = holderCreator;
+    public BannerViewPager<T, VH> setAdapter(BaseBannerAdapter<T, VH> adapter) {
+        this.mBannerPagerAdapter = adapter;
         return this;
     }
 
+    public BaseBannerAdapter<T, VH> getAdapter() {
+        return mBannerPagerAdapter;
+    }
+
     /**
      * Set round rectangle effect for BannerViewPager.
      * <p>
@@ -469,15 +524,47 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @see com.zhpan.bannerview.constants.TransformerStyle#ACCORDION
      */
     public BannerViewPager<T, VH> setPageTransformerStyle(@ATransformerStyle int style) {
-        mViewPager.setPageTransformer(true, new PageTransformerFactory().createPageTransformer(style));
+        mViewPager.setPageTransformer(new PageTransformerFactory().createPageTransformer(style));
         return this;
     }
 
     /**
      * @param transformer PageTransformer that will modify each page's animation properties
      */
-    public void setPageTransformer(@Nullable ViewPager.PageTransformer transformer) {
-        mViewPager.setPageTransformer(true, transformer);
+    public void setPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
+        if (transformer != null)
+            mViewPager.setPageTransformer(transformer);
+    }
+
+    /**
+     * @param transformer PageTransformer that will modify each page's animation properties
+     */
+    public void addPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
+        if (transformer != null) {
+            mCompositePageTransformer.addTransformer(transformer);
+        }
+    }
+
+    public void removeTransformer(@Nullable ViewPager2.PageTransformer transformer) {
+        if (transformer != null) {
+            mCompositePageTransformer.removeTransformer(transformer);
+        }
+    }
+
+
+    /**
+     * set page margin
+     *
+     * @param pageMargin page margin
+     */
+    public BannerViewPager<T, VH> setPageMargin(int pageMargin) {
+        mBannerManager.bannerOptions().setPageMargin(pageMargin);
+        if (mMarginPageTransformer != null) {
+            mCompositePageTransformer.removeTransformer(mMarginPageTransformer);
+        }
+        mMarginPageTransformer = new MarginPageTransformer(pageMargin);
+        mCompositePageTransformer.addTransformer(mMarginPageTransformer);
+        return this;
     }
 
 
@@ -639,13 +726,30 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return this;
     }
 
+    public void create(List<T> data) {
+        if (mBannerPagerAdapter == null) {
+            throw new NullPointerException("You must set adapter for BannerViewPager");
+        }
+        mBannerPagerAdapter.setData(data);
+        initBannerData();
+    }
+
     /**
-     * Create BannerViewPager
+     * Sets the orientation of the ViewPager2.
      *
-     * @param list the data set of Banner
+     * @param orientation {@link androidx.viewpager2.widget.ViewPager2#ORIENTATION_HORIZONTAL} or
+     *                    {@link androidx.viewpager2.widget.ViewPager2#ORIENTATION_VERTICAL}
      */
-    public void create(List<T> list) {
-        initBannerData(list);
+    public BannerViewPager<T, VH> setOrientation(@ViewPager2.Orientation int orientation) {
+        mBannerManager.bannerOptions().setOrientation(orientation);
+        return this;
+    }
+
+    public void setData(List<T> list) {
+        if (list != null && mBannerPagerAdapter != null) {
+            mBannerPagerAdapter.setData(list);
+            initBannerData();
+        }
     }
 
     /**
@@ -696,16 +800,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return this;
     }
 
-    /**
-     * set page margin
-     *
-     * @param pageMargin page margin
-     */
-    public BannerViewPager<T, VH> setPageMargin(int pageMargin) {
-        mBannerManager.bannerOptions().setPageMargin(pageMargin);
-        mViewPager.setPageMargin(pageMargin);
-        return this;
-    }
 
     /**
      * @param revealWidth 一屏多页模式下两边页面显露出来的宽度
@@ -715,20 +809,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return this;
     }
 
-    /**
-     * 获取BannerViewPager中封装的ViewPager,用于设置BannerViewPager未暴露出来的接口,
-     * 比如setCurrentItem等。
-     * <p>
-     * 通过该方法调用getCurrentItem等方法可能会有问题
-     * 2.4.1已废弃,可直接调用BannerViewPager中相关方法替代
-     *
-     * @return BannerViewPager中封装的ViewPager
-     */
-    @Deprecated
-    public ViewPager getViewPager() {
-        return mViewPager;
-    }
-
     public BannerViewPager<T, VH> setOffScreenPageLimit(int offScreenPageLimit) {
         mBannerManager.bannerOptions().setOffScreenPageLimit(offScreenPageLimit);
         return this;
@@ -740,8 +820,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return this;
     }
 
-    public BannerViewPager<T, VH> disableTouchScroll(boolean disableTouchScroll) {
-        mBannerManager.bannerOptions().setDisableTouchScroll(disableTouchScroll);
+    public BannerViewPager<T, VH> setUserInputEnabled(boolean userInputEnabled) {
+        mBannerManager.bannerOptions().setUserInputEnabled(userInputEnabled);
         return this;
     }
 
@@ -749,100 +829,28 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         void onPageClick(int position);
     }
 
-    private ViewPager.OnPageChangeListener mOnPageChangeListener;
-
-    public BannerViewPager<T, VH> setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
-        mOnPageChangeListener = onPageChangeListener;
-        return this;
-    }
-
-
-    /**
-     * set indicator circle radius
-     *
-     * @param normalRadius  unchecked circle radius
-     * @param checkedRadius checked circle radius
-     * @deprecated use {@link #setIndicatorSliderRadius(int, int)} instead
-     */
-    @Deprecated
-    public BannerViewPager<T, VH> setIndicatorRadius(int normalRadius, int checkedRadius) {
-        mBannerManager.bannerOptions().setIndicatorSliderWidth(normalRadius * 2, checkedRadius * 2);
-        return this;
-    }
-
-    /**
-     * set indicator circle radius
-     * <p>
-     * if the indicator style is {@link com.zhpan.indicator.enums.IndicatorStyle#DASH}
-     * or {@link com.zhpan.indicator.enums.IndicatorStyle#ROUND_RECT}
-     * the indicator dash width=2*radius
-     *
-     * @param radius 指示器圆点半径
-     * @deprecated use {@link #setIndicatorSliderRadius(int)} instead
-     */
-    @Deprecated
-    public BannerViewPager<T, VH> setIndicatorRadius(int radius) {
-        setIndicatorSliderRadius(radius, radius);
+    public BannerViewPager<T, VH> registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
+        this.onPageChangeCallback = onPageChangeCallback;
         return this;
     }
 
-
     /**
-     * Set indicator dash width,if indicator style is {@link com.zhpan.indicator.enums.IndicatorStyle#CIRCLE},
-     * the indicator circle radius is indicatorWidth/2.
-     *
-     * @param indicatorWidth indicator dash width.
-     * @deprecated Use {@link #setIndicatorSliderWidth(int)} instead.
-     */
-    @Deprecated
-    public BannerViewPager<T, VH> setIndicatorWidth(int indicatorWidth) {
-        setIndicatorSliderWidth(indicatorWidth, indicatorWidth);
-        return this;
-    }
-
-
-    /**
-     * @deprecated Use {@link #setIndicatorSliderWidth(int, int)} instead.
+     * @param showIndicator is show indicator
+     * @deprecated Use {@link #setIndicatorVisibility(int)} instead.
      */
     @Deprecated
-    public BannerViewPager<T, VH> setIndicatorWidth(int normalWidth, int checkWidth) {
-        mBannerManager.bannerOptions().setIndicatorSliderWidth(normalWidth, checkWidth);
+    public BannerViewPager<T, VH> showIndicator(boolean showIndicator) {
+        mIndicatorLayout.setVisibility(showIndicator ? VISIBLE : GONE);
         return this;
     }
 
     /**
-     * set indicator color
-     *
-     * @param checkedColor checked color of indicator
-     * @param normalColor  unchecked color of indicator
-     * @deprecated use {@link #setIndicatorSliderColor(int, int)} instead
+     * @deprecated user {@link #setUserInputEnabled(boolean)} instead.
      */
     @Deprecated
-    public BannerViewPager<T, VH> setIndicatorColor(@ColorInt int normalColor,
-                                                    @ColorInt int checkedColor) {
-        mBannerManager.bannerOptions().setIndicatorSliderColor(normalColor, checkedColor);
-        return this;
-    }
-
-
-    /**
-     * Set Indicator gap of dash/circle
-     *
-     * @param indicatorGap indicator gap
-     * @deprecated Use {@link #setIndicatorSliderGap(int)} instead.
-     */
-    public BannerViewPager<T, VH> setIndicatorGap(int indicatorGap) {
-        mBannerManager.bannerOptions().setIndicatorGap(indicatorGap);
+    public BannerViewPager<T, VH> disableTouchScroll(boolean disableTouchScroll) {
+        mBannerManager.bannerOptions().setUserInputEnabled(!disableTouchScroll);
         return this;
     }
 
-    /**
-     * @param showIndicator is show indicator
-     * @deprecated Use {@link #setIndicatorVisibility(int)} instead.
-     */
-    @Deprecated
-    public BannerViewPager<T, VH> showIndicator(boolean showIndicator) {
-        mIndicatorLayout.setVisibility(showIndicator ? VISIBLE : GONE);
-        return this;
-    }
 }

+ 82 - 0
bannerview/src/main/java/com/zhpan/bannerview/BaseBannerAdapter.java

@@ -0,0 +1,82 @@
+package com.zhpan.bannerview;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.zhpan.bannerview.utils.BannerUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by zhpan on 2017/3/28.
+ */
+public abstract class BaseBannerAdapter<T, VH extends BaseViewHolder> extends RecyclerView.Adapter<VH> {
+    private List<T> mList = new ArrayList<>();
+    private boolean isCanLoop;
+    static final int MAX_VALUE = 500;
+    private BannerViewPager.OnPageClickListener mPageClickListener;
+
+    @NonNull
+    @Override
+    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View inflate = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
+        return createViewHolder(inflate, viewType);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull VH holder, final int position) {
+        int realPosition = BannerUtils.getRealPosition(isCanLoop, position, mList.size());
+        onBind(holder, mList.get(realPosition), realPosition, mList.size());
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (mPageClickListener != null) {
+                    mPageClickListener.onPageClick(BannerUtils.getRealPosition(isCanLoop, position, mList.size()));
+                }
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        if (isCanLoop && mList.size() > 1) {
+            return MAX_VALUE;
+        } else {
+            return mList.size();
+        }
+    }
+
+    List<T> getData() {
+        return mList;
+    }
+
+    void setData(List<T> list) {
+        if (null != list) {
+            mList.clear();
+            mList.addAll(list);
+        }
+    }
+
+    void setCanLoop(boolean canLoop) {
+        isCanLoop = canLoop;
+    }
+
+    void setPageClickListener(BannerViewPager.OnPageClickListener pageClickListener) {
+        mPageClickListener = pageClickListener;
+    }
+
+    int getListSize() {
+        return mList.size();
+    }
+
+    protected abstract void onBind(VH holder, T data, int position, int pageSize);
+
+    public abstract VH createViewHolder(View itemView, int viewType);
+
+    public abstract int getLayoutId(int viewType);
+}

+ 84 - 0
bannerview/src/main/java/com/zhpan/bannerview/BaseViewHolder.java

@@ -0,0 +1,84 @@
+package com.zhpan.bannerview;
+
+import android.util.SparseArray;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2020/4/5.
+ *   Description:
+ * </pre>
+ */
+public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder {
+
+    private SparseArray<View> mViews = new SparseArray<>();
+
+    public BaseViewHolder(@NonNull View itemView) {
+        super(itemView);
+    }
+
+    public abstract void bindData(T data, int position, int pageSize);
+
+    @SuppressWarnings("unchecked")
+    protected <V extends View> V findView(int viewId) {
+        View view = mViews.get(viewId);
+        if (view == null) {
+            view = itemView.findViewById(viewId);
+            mViews.put(viewId, view);
+        }
+        return (V) view;
+    }
+
+
+    protected void setText(int viewId, String text) {
+        View view = findView(viewId);
+        if (view instanceof TextView) {
+            ((TextView) view).setText(text);
+        }
+    }
+
+    protected void setText(int viewId, @StringRes int textId) {
+        View view = findView(viewId);
+        if (view instanceof TextView) {
+            ((TextView) view).setText(textId);
+        }
+    }
+
+    protected void setTextColor(int viewId, @ColorInt int colorId) {
+        View view = findView(viewId);
+        if (view instanceof TextView) {
+            ((TextView) view).setTextColor(colorId);
+        }
+    }
+
+    protected void setOnClickListener(int viewId, View.OnClickListener clickListener) {
+        View view = findView(viewId);
+        view.setOnClickListener(clickListener);
+    }
+
+    protected void setBackgroundResource(int viewId, @DrawableRes int resId) {
+        View view = findView(viewId);
+        view.setBackgroundResource(resId);
+    }
+
+    protected void setBackgroundColor(int viewId, @ColorInt int colorId) {
+        View view = findView(viewId);
+        view.setBackgroundColor(colorId);
+    }
+
+    protected void setImageResource(@IdRes int viewId, @DrawableRes int resId) {
+        View view = findView(viewId);
+        if (view instanceof ImageView) {
+            ((ImageView) view).setImageResource(resId);
+        }
+    }
+}

+ 0 - 146
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -1,146 +0,0 @@
-package com.zhpan.bannerview.adapter;
-
-import androidx.annotation.NonNull;
-import androidx.viewpager.widget.PagerAdapter;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.zhpan.bannerview.holder.HolderCreator;
-import com.zhpan.bannerview.holder.ViewHolder;
-import com.zhpan.bannerview.utils.BannerUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by zhpan on 2017/3/28.
- */
-
-public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
-
-    private List<T> mList;
-
-    private HolderCreator holderCreator;
-
-    private boolean isCanLoop;
-
-    private PageClickListener mPageClickListener;
-
-    public static final int MAX_VALUE = 500;
-
-    public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
-        mList = new ArrayList<>();
-        mList.addAll(list);
-        this.holderCreator = holderCreator;
-    }
-
-    @Override
-    public int getCount() {
-        if (isCanLoop && mList.size() > 1) {
-            return MAX_VALUE;
-        } else {
-            return mList.size();
-        }
-    }
-
-    @Override
-    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
-        return view == object;
-    }
-
-    @Override
-    public @NonNull
-    Object instantiateItem(@NonNull final ViewGroup container, final int position) {
-        View itemView = getView(container, BannerUtils.getRealPosition(isCanLoop, position, mList.size()));
-        container.addView(itemView);
-        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) {
-//                return view;
-//            }
-//        }
-//        View view = getView(container, position);
-//        view.setTag(position);
-//        mViewList.add(view);
-//        return view;
-//    }
-
-    @SuppressWarnings("unchecked")
-    private View getView(ViewGroup container, final int position) {
-        ViewHolder<T> holder = holderCreator.createViewHolder();
-        if (holder == null) {
-            throw new NullPointerException("Can not return a null holder");
-        }
-        return createView(holder, position, container);
-    }
-
-    private View createView(ViewHolder<T> holder, int position, ViewGroup container) {
-        View itemView = LayoutInflater.from(container.getContext()).inflate(holder.getLayoutId(), container, false);
-        if (mList != null && mList.size() > 0) {
-//            holder.createView(itemView, position);
-            setViewListener(itemView, position);
-            holder.onBind(itemView, mList.get(position), position, mList.size());
-        }
-        return itemView;
-    }
-
-    private void setViewListener(View view, final int position) {
-        if (view != null)
-            view.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (null != mPageClickListener)
-                        mPageClickListener.onPageClick(position);
-                }
-            });
-    }
-
-    @Override
-    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
-        container.removeView((View) object);
-    }
-
-    @Override
-    public void finishUpdate(@NonNull ViewGroup container) {
-        super.finishUpdate(container);
-    }
-
-    public void setPageClickListener(PageClickListener pageClickListener) {
-        mPageClickListener = pageClickListener;
-    }
-
-    public void setCanLoop(boolean canLoop) {
-        isCanLoop = canLoop;
-    }
-
-
-    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();
-    }
-}

+ 0 - 21
bannerview/src/main/java/com/zhpan/bannerview/adapter/OnPageChangeListenerAdapter.java

@@ -1,21 +0,0 @@
-package com.zhpan.bannerview.adapter;
-
-import androidx.viewpager.widget.ViewPager;
-
-public abstract class OnPageChangeListenerAdapter implements ViewPager.OnPageChangeListener {
-
-    @Override
-    public void onPageSelected(int position) {
-
-    }
-
-    @Override
-    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-
-    }
-
-    @Override
-    public void onPageScrollStateChanged(int state) {
-
-    }
-}

+ 3 - 1
bannerview/src/main/java/com/zhpan/bannerview/constants/PageStyle.java

@@ -11,7 +11,9 @@ public interface PageStyle {
     int NORMAL = 0;
 
     int MULTI_PAGE = 1 << 1;
-
+    /**
+     * Requires Api Version >= 21
+     */
     int MULTI_PAGE_OVERLAP = 1 << 2;
 
     int MULTI_PAGE_SCALE = 1 << 3;

+ 0 - 13
bannerview/src/main/java/com/zhpan/bannerview/holder/HolderCreator.java

@@ -1,13 +0,0 @@
-package com.zhpan.bannerview.holder;
-
-/**
- * Created by zhpan on 2017/10/30.
- * Description:
- */
-
-public interface HolderCreator<VH extends ViewHolder> {
-    /**
-     * 创建ViewHolder
-     */
-    VH createViewHolder();
-}

+ 0 - 26
bannerview/src/main/java/com/zhpan/bannerview/holder/ViewHolder.java

@@ -1,26 +0,0 @@
-package com.zhpan.bannerview.holder;
-
-import android.view.View;
-
-import androidx.annotation.LayoutRes;
-
-/**
- * Created by zhpan on 2017/10/30.
- * Description:
- */
-
-public interface ViewHolder<T> {
-
-    /**
-     * @return Layout Resource of BannerViewPager item
-     */
-    @LayoutRes int getLayoutId();
-
-    /**
-     * @param itemView  ViewPager item View
-     * @param data     实体类对象
-     * @param position 当前位置
-     * @param size     页面个数
-     */
-    void onBind(View itemView, T data, int position, int size);
-}

+ 1 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/CircleIndicatorView.java

@@ -13,6 +13,7 @@ import com.zhpan.indicator.base.BaseIndicatorView;
  *
  * @deprecated Use {@link com.zhpan.indicator.IndicatorView} instead.
  */
+@Deprecated
 public class CircleIndicatorView extends BaseIndicatorView {
 
     private float mNormalRadius;

+ 24 - 12
bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java

@@ -1,5 +1,7 @@
 package com.zhpan.bannerview.manager;
 
+import androidx.viewpager2.widget.ViewPager2;
+
 import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.indicator.option.IndicatorOptions;
@@ -20,7 +22,7 @@ public class BannerOptions {
 
     public static final int DEFAULT_SCROLL_DURATION = 500;
 
-    private int offScreenPageLimit;
+    private int offScreenPageLimit = ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT;
 
     private int interval;
 
@@ -48,7 +50,9 @@ public class BannerOptions {
 
     private int mRoundRadius;
 
-    private boolean disableTouchScroll;
+    private boolean userInputEnabled = true;
+
+    private int orientation = ViewPager2.ORIENTATION_HORIZONTAL;
 
     private IndicatorOptions mIndicatorOptions;
 
@@ -113,14 +117,14 @@ public class BannerOptions {
     }
 
 
-
-    public void setIndicatorSliderColor(int normalColor,int checkedColor){
-        mIndicatorOptions.setSliderColor(normalColor,checkedColor);
+    public void setIndicatorSliderColor(int normalColor, int checkedColor) {
+        mIndicatorOptions.setSliderColor(normalColor, checkedColor);
     }
 
-    public void setIndicatorSliderWidth(int normalWidth,int checkedWidth){
-        mIndicatorOptions.setSliderWidth(normalWidth,checkedWidth);
+    public void setIndicatorSliderWidth(int normalWidth, int checkedWidth) {
+        mIndicatorOptions.setSliderWidth(normalWidth, checkedWidth);
     }
+
     public int getCheckedIndicatorWidth() {
         return (int) mIndicatorOptions.getCheckedSliderWidth();
     }
@@ -218,15 +222,23 @@ public class BannerOptions {
         mIndicatorVisibility = indicatorVisibility;
     }
 
-    public boolean isDisableTouchScroll() {
-        return disableTouchScroll;
+    public int getOrientation() {
+        return orientation;
+    }
+
+    public void setOrientation(int orientation) {
+        this.orientation = orientation;
+    }
+
+    public boolean isUserInputEnabled() {
+        return userInputEnabled;
     }
 
-    public void setDisableTouchScroll(boolean disableTouchScroll) {
-        this.disableTouchScroll = disableTouchScroll;
+    public void setUserInputEnabled(boolean userInputEnabled) {
+        this.userInputEnabled = userInputEnabled;
     }
 
-    public void resetIndicatorOptions(){
+    public void resetIndicatorOptions() {
         mIndicatorOptions.setCurrentPosition(0);
         mIndicatorOptions.setSlideProgress(0);
     }

+ 0 - 36
bannerview/src/main/java/com/zhpan/bannerview/provider/BannerScroller.java

@@ -1,36 +0,0 @@
-package com.zhpan.bannerview.provider;
-
-import android.content.Context;
-import android.view.animation.Interpolator;
-import android.widget.Scroller;
-
-public class BannerScroller extends Scroller {
-    private int mDuration = 1000;
-
-    public BannerScroller(Context context) {
-        super(context);
-    }
-
-    public BannerScroller(Context context, Interpolator interpolator) {
-        super(context, interpolator);
-    }
-
-    public BannerScroller(Context context, Interpolator interpolator, boolean flywheel) {
-        super(context, interpolator, flywheel);
-    }
-
-    @Override
-    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
-        super.startScroll(startX, startY, dx, dy, mDuration);
-    }
-
-    @Override
-    public void startScroll(int startX, int startY, int dx, int dy) {
-        super.startScroll(startX, startY, dx, dy, mDuration);
-    }
-
-    public void setDuration(int time) {
-        mDuration = time;
-    }
-
-}

+ 3 - 2
bannerview/src/main/java/com/zhpan/bannerview/transform/BaseTransformer.java

@@ -16,10 +16,11 @@
 
 package com.zhpan.bannerview.transform;
 
-import androidx.viewpager.widget.ViewPager.PageTransformer;
+import androidx.viewpager2.widget.ViewPager2;
+
 import android.view.View;
 
-public abstract class BaseTransformer implements PageTransformer {
+public abstract class BaseTransformer implements ViewPager2.PageTransformer {
 
     /**
      * Called each {@link #transformPage(View, float)}.

+ 12 - 0
bannerview/src/main/java/com/zhpan/bannerview/transform/Extensions.kt

@@ -0,0 +1,12 @@
+package com.zhpan.bannerview.transform
+
+import android.content.res.Resources
+
+fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
+fun Int.toPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()
+
+fun Float.cube(): Float = this * this * this
+fun Int.cube(): Int = this * this * this
+
+fun Float.sqr(): Float = this * this
+fun Int.sqr(): Int = this * this

+ 85 - 0
bannerview/src/main/java/com/zhpan/bannerview/transform/OverlapPageTransformer.kt

@@ -0,0 +1,85 @@
+package com.zhpan.bannerview.transform
+
+import android.os.Build
+import android.view.View
+import androidx.annotation.RequiresApi
+import androidx.viewpager2.widget.ViewPager2
+import kotlin.math.abs
+import kotlin.math.max
+
+/**
+ * @param: gives veiwpager2 orientation
+ * Source from:https://github.com/KoderLabs/finite-cover-flow/blob/dev/lib/src/main/java/com/saeed/finiteflow/lib/OverlapPageTransformert
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+class OverlapPageTransformer(
+    private val orientation: Int,
+    private val minScale: Float = 0f,
+    private val unSelectedItemRotation: Float = 0f,
+    private val unSelectedItemAlpha: Float = 0f,
+    private val itemGap: Float = 0f
+) : ViewPager2.PageTransformer {
+
+    init {
+        require(minScale in 0f..1f) { "minScale value should be between 1.0 to 0.0" }
+        require(unSelectedItemAlpha in 0f..1f) { "unSelectedItemAlpha value should be between 1.0 to 0.0" }
+    }
+
+    private val scalingValue = 0.2f
+
+    override fun transformPage(page: View, position: Float) {
+        page.apply {
+            elevation = -abs(position)
+
+            val delta = max(1f - abs(position * (1 - 0.5f)), 0.5f)
+
+            if (unSelectedItemRotation != 0f) {
+                val rotation =
+                    (1 - delta) * if (position > 0) unSelectedItemRotation else -unSelectedItemRotation
+
+                rotationY = rotation
+            }
+
+            val scaleDelta = abs(position * scalingValue)
+            val scale = max(1f - scaleDelta, minScale)
+
+            scaleX = scale
+            scaleY = scale
+
+            when (orientation) {
+                ViewPager2.ORIENTATION_HORIZONTAL -> {
+                    translationX =
+                        position * (itemGap.toInt() / 2).toPx() +
+                                if (position > 0) {
+                                    (-width * (1f - scale))
+                                } else {
+                                    (width * (1f - scale))
+                                }
+                }
+                ViewPager2.ORIENTATION_VERTICAL -> {
+                    translationY = position * (itemGap.toInt()).toPx() +
+                            if (position > 0) {
+                                (-width * (1f - scale))
+                            } else {
+                                (width * (1f - scale))
+                            }
+                }
+                else -> throw IllegalArgumentException("Gives correct orientation value, ViewPager2.ORIENTATION_HORIZONTAL or ViewPager2.ORIENTATION_VERTICAL")
+            }
+
+            if (unSelectedItemAlpha != 1f) {
+                alpha = when {
+                    position >= -1f && position <= 1f -> { // (0, 1]
+                        // page move from right to center.
+                        0.5f + ((1 - abs(position)) * 0.5f)
+                    }
+                    else -> {
+                        0.5f / abs(position * position)
+
+                    }
+                }
+            }
+        }
+    }
+
+}

+ 3 - 3
bannerview/src/main/java/com/zhpan/bannerview/transform/PageTransformerFactory.java

@@ -1,6 +1,6 @@
 package com.zhpan.bannerview.transform;
 
-import androidx.viewpager.widget.ViewPager;
+import androidx.viewpager2.widget.ViewPager2;
 
 import static com.zhpan.bannerview.constants.TransformerStyle.ACCORDION;
 import static com.zhpan.bannerview.constants.TransformerStyle.DEPTH;
@@ -11,8 +11,8 @@ import static com.zhpan.bannerview.constants.TransformerStyle.STACK;
 
 public class PageTransformerFactory {
 
-    public ViewPager.PageTransformer createPageTransformer(int transformerStyle) {
-        ViewPager.PageTransformer transformer = null;
+    public ViewPager2.PageTransformer createPageTransformer(int transformerStyle) {
+        ViewPager2.PageTransformer transformer = null;
         switch (transformerStyle) {
             case DEPTH:
                 transformer = new DepthPageTransformer();

+ 2 - 2
bannerview/src/main/java/com/zhpan/bannerview/transform/ScaleInTransformer.java

@@ -2,9 +2,9 @@ package com.zhpan.bannerview.transform;
 
 import android.view.View;
 
-import androidx.viewpager.widget.ViewPager;
+import androidx.viewpager2.widget.ViewPager2;
 
-public class ScaleInTransformer implements ViewPager.PageTransformer {
+public class ScaleInTransformer implements ViewPager2.PageTransformer {
 
     private static final float DEFAULT_CENTER = 0.5f;
     public static final float DEFAULT_MIN_SCALE = 0.85f;

+ 0 - 147
bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java

@@ -1,147 +0,0 @@
-package com.zhpan.bannerview.view;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-
-import androidx.viewpager.widget.ViewPager;
-
-import android.util.AttributeSet;
-import android.util.SparseIntArray;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.zhpan.bannerview.provider.BannerScroller;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collections;
-
-import static com.zhpan.bannerview.manager.BannerOptions.DEFAULT_SCROLL_DURATION;
-
-/**
- * Author zhangpan
- * Time:2018/11/14 15:24
- * Description:处理嵌套PhotoView缩放引起的crash.
- */
-public class CatchViewPager extends ViewPager {
-    private ArrayList<Integer> mArrayList = new ArrayList<>();
-    private SparseIntArray mSparseIntArray = new SparseIntArray();
-    private boolean mOverlapStyle = false;
-    private BannerScroller mBannerScroller;
-    private boolean disableTouchScroll;
-    private boolean firstLayout = true;
-
-    public CatchViewPager(Context context) {
-        this(context, null);
-    }
-
-    public CatchViewPager(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        hookScroller();
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        try {
-            if (disableTouchScroll) {
-                return false;
-            }
-            return super.onInterceptTouchEvent(ev);
-        } catch (IllegalArgumentException ex) {
-            ex.printStackTrace();
-        }
-        return false;
-    }
-
-    @Override
-    protected int getChildDrawingOrder(int childCount, int i) {
-        if (mOverlapStyle) {
-            if (i == 0 || mSparseIntArray.size() != childCount) {
-                mArrayList.clear();
-                mSparseIntArray.clear();
-                int viewCenterX = getViewCenterX(this);
-                for (int index = 0; index < childCount; ++index) {
-                    int indexAbs = Math.abs(viewCenterX - getViewCenterX(getChildAt(index)));
-                    mArrayList.add(++indexAbs);
-                    mSparseIntArray.append(indexAbs, index);
-                }
-                Collections.sort(mArrayList);
-            }
-            return mSparseIntArray.get(mArrayList.get(childCount - 1 - i));
-        } else {
-            return super.getChildDrawingOrder(childCount, i);
-        }
-    }
-
-    private int getViewCenterX(View view) {
-        int[] array = new int[2];
-        view.getLocationOnScreen(array);
-        return array[0] + view.getWidth() / 2;
-    }
-
-    public void setOverlapStyle(boolean overlapStyle) {
-        mOverlapStyle = overlapStyle;
-    }
-
-    public void setScrollDuration(int scrollDuration) {
-        mBannerScroller.setDuration(scrollDuration);
-    }
-
-    @SuppressLint("ClickableViewAccessibility")
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        if (disableTouchScroll) {
-            return false;
-        }
-        return super.onTouchEvent(ev);
-    }
-
-    public void disableTouchScroll(boolean disableTouchScroll) {
-        this.disableTouchScroll = disableTouchScroll;
-    }
-
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        hookFirstLayout();
-    }
-
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        firstLayout = false;
-    }
-
-    private void hookScroller() {
-        try {
-            mBannerScroller = new BannerScroller(getContext());
-            mBannerScroller.setDuration(DEFAULT_SCROLL_DURATION);
-            Field mField = ViewPager.class.getDeclaredField("mScroller");
-            mField.setAccessible(true);
-            mField.set(this, mBannerScroller);
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        } catch (NoSuchFieldException e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void hookFirstLayout() {
-        try {
-            Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");
-            mFirstLayout.setAccessible(true);
-            mFirstLayout.set(this, firstLayout);
-            setCurrentItem(getCurrentItem());
-        } catch (IllegalAccessException  e) {
-            e.printStackTrace();
-        } catch (NoSuchFieldException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void setFirstLayout(boolean firstLayout) {
-        this.firstLayout = firstLayout;
-    }
-}

+ 2 - 3
bannerview/src/main/res/layout/bvp_layout.xml

@@ -5,8 +5,7 @@
     android:layout_height="wrap_content"
     tools:parentTag="android.widget.RelativeLayout">
 
-
-    <com.zhpan.bannerview.view.CatchViewPager
+    <androidx.viewpager2.widget.ViewPager2
         android:id="@+id/vp_main"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
@@ -15,5 +14,5 @@
         android:id="@+id/bvp_layout_indicator"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"/>
+        android:layout_alignParentBottom="true" />
 </merge>

+ 1 - 1
build.gradle

@@ -10,7 +10,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.0'
+        classpath 'com.android.tools.build:gradle:3.5.3'
         classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"