Browse Source

Merge branch 'dev_2.5.0' into jc_2.5.0

# Conflicts:
#	app/src/main/java/com/example/zhpan/circleviewpager/activity/BannerPhotoViewActivity.java
#	app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerActivity.java
#	app/src/main/java/com/example/zhpan/circleviewpager/activity/PageTransformerActivity.java
#	app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
#	bannerview/build.gradle
#	bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
#	bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java
#	bannerview/src/main/java/com/zhpan/bannerview/adapter/OnPageChangeListenerAdapter.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/AIndicatorGravity.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/AIndicatorSlideMode.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/AIndicatorStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/APageStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/ATransformerStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/annotation/Visibility.java
#	bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorGravity.java
#	bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorSlideMode.java
#	bannerview/src/main/java/com/zhpan/bannerview/constants/IndicatorStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/constants/PageStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/constants/TransformerStyle.java
#	bannerview/src/main/java/com/zhpan/bannerview/indicator/BaseIndicatorView.java
#	bannerview/src/main/java/com/zhpan/bannerview/indicator/CircleIndicatorView.java
#	bannerview/src/main/java/com/zhpan/bannerview/indicator/DashIndicatorView.java
#	bannerview/src/main/java/com/zhpan/bannerview/indicator/IIndicator.java
#	bannerview/src/main/java/com/zhpan/bannerview/indicator/IndicatorFactory.java
#	bannerview/src/main/java/com/zhpan/bannerview/transform/BaseTransformer.java
#	bannerview/src/main/java/com/zhpan/bannerview/transform/PageTransformerFactory.java
#	bannerview/src/main/java/com/zhpan/bannerview/transform/pagestyle/BasePageTransformer.java
#	bannerview/src/main/java/com/zhpan/bannerview/transform/pagestyle/NonPageTransformer.java
#	bannerview/src/main/java/com/zhpan/bannerview/transform/pagestyle/ScaleInTransformer.java
#	bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java
#	bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java
zhpanvip 5 years ago
parent
commit
335fa03f4e
100 changed files with 1468 additions and 376 deletions
  1. 201 0
      LICENSE
  2. 347 60
      README.md
  3. 5 1
      app/build.gradle
  4. 11 0
      app/proguard-rules.pro
  5. 0 26
      app/src/androidTest/java/com/example/zhpan/circleviewpager/ExampleInstrumentedTest.java
  6. 10 5
      app/src/main/AndroidManifest.xml
  7. 0 3
      app/src/main/java/com/example/zhpan/circleviewpager/App.java
  8. 0 51
      app/src/main/java/com/example/zhpan/circleviewpager/activity/BannerPhotoViewActivity.java
  9. 26 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java
  10. 0 62
      app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerActivity.java
  11. 65 21
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java
  12. 0 81
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PageTransformerActivity.java
  13. 30 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.java
  14. 118 0
      app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java
  15. 62 0
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.java
  16. 1 0
      app/src/main/java/com/example/zhpan/circleviewpager/bean/CustomBean.java
  17. 5 10
      app/src/main/java/com/example/zhpan/circleviewpager/bean/DataWrapper.java
  18. 84 0
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/BaseFragment.java
  19. 68 39
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
  20. 129 0
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java
  21. 120 0
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java
  22. 4 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/ApiService.java
  23. 30 0
      app/src/main/java/com/example/zhpan/circleviewpager/view/CornerImageView.java
  24. 80 0
      app/src/main/java/com/example/zhpan/circleviewpager/view/FigureIndicatorView.java
  25. 21 8
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/CustomPageViewHolder.java
  26. 38 0
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/ImageResourceViewHolder.java
  27. 8 5
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java
  28. 5 4
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/TransformerViewHolder.java
  29. BIN
      app/src/main/res/drawable-hdpi/a0.jpeg
  30. BIN
      app/src/main/res/drawable-hdpi/a1.jpg
  31. BIN
      app/src/main/res/drawable-hdpi/a2.jpeg
  32. BIN
      app/src/main/res/drawable-hdpi/a3.jpeg
  33. BIN
      app/src/main/res/drawable-hdpi/a4.jpeg
  34. BIN
      app/src/main/res/drawable-hdpi/b0.jpg
  35. BIN
      app/src/main/res/drawable-hdpi/b1.jpg
  36. BIN
      app/src/main/res/drawable-hdpi/b2.jpg
  37. BIN
      app/src/main/res/drawable-hdpi/b3.jpg
  38. BIN
      app/src/main/res/drawable-hdpi/c0.jpg
  39. BIN
      app/src/main/res/drawable-hdpi/c1.jpg
  40. BIN
      app/src/main/res/drawable-hdpi/c2.jpg
  41. BIN
      app/src/main/res/drawable-hdpi/c3.jpg
  42. BIN
      app/src/main/res/drawable-hdpi/c4.jpg
  43. BIN
      app/src/main/res/drawable-hdpi/placeholder.jpg
  44. BIN
      app/src/main/res/drawable-xhdpi/a0.jpeg
  45. BIN
      app/src/main/res/drawable-xhdpi/a1.jpg
  46. BIN
      app/src/main/res/drawable-xhdpi/a2.jpeg
  47. BIN
      app/src/main/res/drawable-xhdpi/a3.jpeg
  48. BIN
      app/src/main/res/drawable-xhdpi/a4.jpeg
  49. BIN
      app/src/main/res/drawable-xhdpi/b0.jpg
  50. BIN
      app/src/main/res/drawable-xhdpi/b1.jpg
  51. BIN
      app/src/main/res/drawable-xhdpi/b2.jpg
  52. BIN
      app/src/main/res/drawable-xhdpi/b3.jpg
  53. BIN
      app/src/main/res/drawable-xhdpi/c0.jpg
  54. BIN
      app/src/main/res/drawable-xhdpi/c1.jpg
  55. BIN
      app/src/main/res/drawable-xhdpi/c2.jpg
  56. BIN
      app/src/main/res/drawable-xhdpi/c3.jpg
  57. BIN
      app/src/main/res/drawable-xhdpi/c4.jpg
  58. BIN
      app/src/main/res/drawable-xhdpi/creative_hover.png
  59. BIN
      app/src/main/res/drawable-xhdpi/creative_none.png
  60. BIN
      app/src/main/res/drawable-xhdpi/discover_hover.png
  61. BIN
      app/src/main/res/drawable-xhdpi/discover_none.png
  62. BIN
      app/src/main/res/drawable-xhdpi/home_hover.png
  63. BIN
      app/src/main/res/drawable-xhdpi/home_none.png
  64. BIN
      app/src/main/res/drawable-xhdpi/placeholder.jpg
  65. BIN
      app/src/main/res/drawable-xxhdpi/a0.jpeg
  66. BIN
      app/src/main/res/drawable-xxhdpi/a1.jpg
  67. BIN
      app/src/main/res/drawable-xxhdpi/a2.jpeg
  68. BIN
      app/src/main/res/drawable-xxhdpi/a3.jpeg
  69. BIN
      app/src/main/res/drawable-xxhdpi/a4.jpeg
  70. BIN
      app/src/main/res/drawable-xxhdpi/b0.jpg
  71. BIN
      app/src/main/res/drawable-xxhdpi/b1.jpg
  72. BIN
      app/src/main/res/drawable-xxhdpi/b2.jpg
  73. BIN
      app/src/main/res/drawable-xxhdpi/b3.jpg
  74. BIN
      app/src/main/res/drawable-xxhdpi/c0.jpg
  75. BIN
      app/src/main/res/drawable-xxhdpi/c1.jpg
  76. BIN
      app/src/main/res/drawable-xxhdpi/c2.jpg
  77. BIN
      app/src/main/res/drawable-xxhdpi/c3.jpg
  78. BIN
      app/src/main/res/drawable-xxhdpi/c4.jpg
  79. BIN
      app/src/main/res/drawable-xxhdpi/guide0.jpg
  80. BIN
      app/src/main/res/drawable-xxhdpi/guide1.jpg
  81. BIN
      app/src/main/res/drawable-xxhdpi/guide2.jpg
  82. BIN
      app/src/main/res/drawable-xxhdpi/placeholder.jpg
  83. BIN
      app/src/main/res/drawable-xxhdpi/t0.jpg
  84. BIN
      app/src/main/res/drawable-xxhdpi/t1.jpg
  85. BIN
      app/src/main/res/drawable-xxhdpi/t2.jpg
  86. BIN
      app/src/main/res/drawable-xxhdpi/t3.jpg
  87. BIN
      app/src/main/res/drawable-xxxhdpi/a0.jpeg
  88. BIN
      app/src/main/res/drawable-xxxhdpi/a1.jpg
  89. BIN
      app/src/main/res/drawable-xxxhdpi/a2.jpeg
  90. BIN
      app/src/main/res/drawable-xxxhdpi/a3.jpeg
  91. BIN
      app/src/main/res/drawable-xxxhdpi/a4.jpeg
  92. BIN
      app/src/main/res/drawable-xxxhdpi/b0.jpg
  93. BIN
      app/src/main/res/drawable-xxxhdpi/b1.jpg
  94. BIN
      app/src/main/res/drawable-xxxhdpi/b2.jpg
  95. BIN
      app/src/main/res/drawable-xxxhdpi/b3.jpg
  96. BIN
      app/src/main/res/drawable-xxxhdpi/c0.jpg
  97. BIN
      app/src/main/res/drawable-xxxhdpi/c1.jpg
  98. BIN
      app/src/main/res/drawable-xxxhdpi/c2.jpg
  99. BIN
      app/src/main/res/drawable-xxxhdpi/c3.jpg
  100. BIN
      app/src/main/res/drawable-xxxhdpi/c4.jpg

+ 201 - 0
LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.

+ 347 - 60
README.md

@@ -1,115 +1,402 @@
+# BannerViewPager
 
+[![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0)
+[![MinSdk](https://img.shields.io/badge/API-19%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=19)
+[![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)
 
 ## 效果预览
 
-![这里写图片描述](https://github.com/zhpanvip/BannerViewPager/blob/v_2.1.0/image/ezgif-4-f4cd74cd939d.gif)
+ ### [点击或扫描二维码下载apk](https://github.com/zhpanvip/BannerViewPager/raw/master/download/app.apk)
+
+![扫描下载Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qrcode.png)
+
+
+### 1.setPageStyle
+
+[一屏多页Demo](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.setIndicatorStyle
+BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义IndicatorView的功能。只要继承BaseIndicatorView或者实现IIndicator接口,并重写相应方法,就可以为所欲为的打造任意的Indicator了。
+
+[IndicatorViewStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
+
+| CIRCLE | DASH | Custom |
+|--|--|--|
+| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_circle.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_dash.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) |
+
+### 3.setIndicatorSlideMode
+
+| NORMAL | SMOOTH |
+|--|--|
+| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_normal.gif) |  ![SMOOTH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/slide_smooth.gif) |
+
+
+### 4.setPageTransformerStyle
+
+[TransformStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java)
+
+| 参数 | STACK | ROTATE | DEPTH | ACCORDION |
+|--|--|--|--|--|
+| 预览 | ![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
 
 | 方法名 | 方法描述 | 说明 |
 |--|--|--|
-| startLoop() |开启自动轮播  |  |
-| stopLoop() | 停止自动轮播 |  |
-| setInterval(int interval) | 自动轮播事件间隔 |单位毫秒,默认值3000  |
-| setCanLoop(boolean canLoop) | 是否可以循环 |  默认值true|
-| setRoundCorner(@DimenRes int radius) | 设置圆角 |默认无圆角 需要SDK_INT>=LOLLIPOP(21)  |
-| setRoundCorner(float radiusDp) | 设置圆角 | 单位dp,默认无圆角 需要SDK_INT>=LOLLIPOP(21)|
-| showIndicator(boolean showIndicator) |  是否显示指示器|默认值true  |
-| setIndicatorGravity(int gravity) | 指示器位置(0 Center、1 Start、2 End) |默认值0 Center |
-| setIndicatorColor(int normalColor,int checkedColor) | 指示器圆点颜色 |normalColor:未选中时颜色默认"#000000", checkedColor:选中时颜色 默认"#FFFFFF" |
-| setIndicatorRadius(float radiusDp) | 指示器圆点半径 | 单位dp 默认值4dp|
-| setIndicatorRadius(@DimenRes int radiusRes) | 指示器圆点半径| DimenRes资源 默认值4dp|
-| setCurrentItem(final int position)  |  切换到第position个页面|  |
-| setCurrentItem(final int position, final boolean smoothScroll) | 平滑切换到第position个页面 |  |
-| setData(List<T> list) |设置Banner数据  |  |
-| setHolderCreator(HolderCreator<VH> holderCreator) |设置HolderCreator  |必须设置HolderCreator,否则会抛出RuntimeException  |
-| create() |初始化并构造BannerViewPager  |必须调用,否则前面设置的参数无效  |
+| BannerViewPager<T, VH> setCanLoop(boolean canLoop) | 是否开启循环 | 默认值true|
+| BannerViewPager<T, VH> setAutoPlay(boolean autoPlay) | 是否开启自动轮播 | 默认值true|
+| BannerViewPager<T, VH> setInterval(int interval) | 自动轮播时间间隔 |单位毫秒,默认值3000  |
+| BannerViewPager<T, VH> setScrollDuration(int scrollDuration) | 设置页面滚动时间 | 设置页面滚动时间 |单位毫秒,默认值800  |
+| BannerViewPager<T, VH> setRoundCorner(int radius) | 设置圆角 |默认无圆角 需要SDK_INT>=LOLLIPOP(API 21)  |
+| BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener onPageClickListener) | 设置页面点击事件 |  |
+| BannerViewPager<T, VH> setHolderCreator(HolderCreator\<VH> holderCreator) |设置HolderCreator  |必须设置HolderCreator,否则会抛出NullPointerException|
+| BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) | indicator vibility |默认值VISIBLE 2.4.2 新增|
+| BannerViewPager<T, VH> setIndicatorStyle(int indicatorStyle) | 设置指示器样式 | 可选枚举(CIRCLE, DASH) 默认CIRCLE  |
+| BannerViewPager<T, VH> setIndicatorGravity(int gravity) | 指示器位置 |可选值(CENTER、START、END)默认值CENTER |
+| BannerViewPager<T, VH> setIndicatorColor(int normalColor,int checkedColor) | 指示器圆点颜色 |normalColor:未选中时颜色默认"#8C6C6D72", checkedColor:选中时颜色 默认"#8C18171C" |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH),默认值NORMAL  |
+| BannerViewPager<T, VH> setIndicatorRadius(int radius) | 设置指示器圆点半径 | 默认值4dp|
+| BannerViewPager<T, VH> setIndicatorRadius(int normalRadius,int checkRadius)  |设置指示器圆点半径  |  normalRadius:未选中时半径  checkedRadius:选中时的半径,默认值4dp |
+| BannerViewPager<T, VH> setIndicatorWidth(int indicatorWidth) | 设置指示器宽度,如果是圆形指示器,则为直径 |  默认值8dp|
+| BannerViewPager<T, VH> setIndicatorWidth(int normalWidth, int checkWidth) | 设置指示器宽度,如果是圆形指示器,则为直径 | 默认值8dp |
+| BannerViewPager<T, VH> setIndicatorHeight(int indicatorHeight) | 设置指示器高度,仅在Indicator样式为DASH时有效 | 默认值normalIndicatorWidth/2 |
+| BannerViewPager<T, VH> setIndicatorGap(int indicatorMargin) | 指示器圆点间距| 默认值为指示器宽度(或者是圆的直径)|
+| BannerViewPager<T, VH> setIndicatorView(IIndicator indicatorView) | 设置自定义指示器|自定义View需要继承BaseIndicatorView或实现IIndicator |
+| BannerViewPager<T, VH> setPageTransformerStyle(int style) | 设置页面Transformer内置样式 |  |
+| BannerViewPager<T, VH> setCurrentItem(int item) | Set the currently selected page. | 2.3.5新增 |
+| int getCurrentItem() | 获取当前position | 2.3.5新增 |
+| BannerViewPager<T, VH> setPageStyle(PageStyle pageStyle) | 设置页面样式 | 2.4.0新增 可选(MULTI_PAGE、NORMAL)MULTI_PAGE:一屏多页样式 |
+| BannerViewPager<T, VH> setPageMargin(int pageMargin) | 设置页面间隔 | 2.4.0新增 |
+| BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) | 设置Indicator边距 | 2.4.1新增 |
+| BannerViewPager<T, VH> setOnPageChangeListener(OnPageChangeListener l) | 页面改变的监听事件 | 2.4.3新增 |
+| void startLoop() |开启自动轮播 | 初始化BannerViewPager时不必调用该方法,设置setAutoPlay后会调用startLoop() |
+| void stopLoop() | 停止自动轮播 | 如果开启自动轮播,为避免内存泄漏需要在onStop()或onDestroy中调用此方法 |
+| List\<T> getList() | 获取Banner中的集合数据 |  |
+| void create(List<T> list) |初始化并构造BannerViewPager  |必须调用,否则前面设置的参数无效  |
+
+### xml支持的attrs
+| Attributes | format | description |
+|--|--|--|
+| bvp_interval | integer | 自动轮播时间间隔 |
+| bvp_scroll_duration | integer | 页面切换时滑动时间|
+| bvp_can_loop | boolean| 是否循环 |
+| bvp_auto_play | boolean | 是否自动播放  |
+| bvp_indicator_checked_color | color | indicator选中时颜色 |
+| bvp_indicator_normal_color | color | indicator未选中时颜色 |
+| bvp_indicator_radius | dimension | indicator圆点半径或者Dash模式的1/2宽度  |
+| bvp_round_corner| dimension  | Banner圆角大小 |
+| bvp_page_margin | dimension | 页面item间距 |
+| bvp_reveal_width | dimension | 一屏多页模式下两边item漏出的宽度 |
+| bvp_indicator_style | enum | indicator样式(circle/dash)  |
+| bvp_indicator_slide_mode | enum | indicator滑动模式(normal/smooth) |
+| bvp_indicator_gravity | enum | indicator位置(center/start/end) |
+| bvp_page_style | enum | page样式(normal/multi_page/multi_page_overlap/multi_page_scale) |
+| bvp_transformer_style | enum | transform样式(normal/depth/stack/accordion) |
+| bvp_indicator_visibility| enum | indicator visibility(visible/gone/invisible) |
+
 
 ## 如何使用
- [ ![Download](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
 
-   **gradle中添加依赖**
+### 1.gradle中添加依赖
+   
 
+如果您已迁移到AndroidX,请在项目的root build.gradle中添加如下配置:
+```
+allprojects {
+		repositories {
+			...
+			maven { url 'https://jitpack.io' }
+		}
+	}
+	
+```
+Add the dependency
+
+```
+implementation 'com.github.zhpanvip:BannerViewPager:latestVersion'
+
+```
+
+Androidx latestVersion:[![latestVersion](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
+
+如果未迁移到AndroidX请使用(非Androidx的包托管在JCenter上):
 ```
 implementation 'com.zhpan.library:bannerview:latestVersion'
 ```
 
-  **在xml文件中添加如下代码:**
+非Androidx latestVersion: [ ![latestVersion](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
+
+### 2.在xml文件中添加如下代码:
 
 ```
     <com.zhpan.bannerview.BannerViewPager
-            android:id="@+id/viewpager"
+            android:id="@+id/banner_view"
             android:layout_width="match_parent"
-            android:layout_height="150dp"
-            android:layout_margin="10dp" />
+            android:layout_margin="10dp"
+            android:layout_height="160dp" />
 ```
 
- **BannerViewPager参数配置**
+### 3.Banner的Item页面布局
 
 ```
-	private void initViewPager() {
-            mViewpager = findViewById(R.id.viewpager);
-            mViewpager.showIndicator(true)
-                    .setInterval(3000)
-                    .setRoundCorner(R.dimen.banner_corner)
-                    .setScrollDuration(1000)
-                    .setData(mDataList)
-                    .setHolderCreator(new HolderCreator<DataViewHolder>() {
-                        @Override
-                        public DataViewHolder createViewHolder() {
-                            return new DataViewHolder();
-                        }
-                    })
-                    .setOnPageClickListener(new BannerViewPager.OnPageClickListener() {
-                        @Override
-                        public void onPageClick(int position) {
-                            Toast.makeText(ViewPagerActivity.this, "点击了图片" + position, Toast.LENGTH_SHORT).show();
-                        }
-                    }).create();
-        }
+<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>
 ```
 
-**自定义ViewHolder** 
-  
+### 4.自定义ViewHolder
+
 ```
-public class DataViewHolder implements ViewHolder<DataBean> {
+public class NetViewHolder implements ViewHolder<BannerData> {
     private ImageView mImageView;
+    private TextView mTextView;
 
     @Override
     public View createView(ViewGroup viewGroup, Context context, int position) {
-        // 返回页面布局文件
-        View view = LayoutInflater.from(context).inflate(R.layout.item_view, viewGroup, false);
+        View view = LayoutInflater.from(context).inflate(R.layout.item_net, viewGroup, false);
         mImageView = view.findViewById(R.id.banner_image);
+        mTextView = view.findViewById(R.id.tv_describe);
         return view;
     }
 
     @Override
-    public void onBind(final Context context, DataBean data, final int position, final int size) {
-        ImageLoaderUtil.loadImg(mImageView, data.getUrl(), R.drawable.placeholder);
+    public void onBind(Context context, BannerData data, int position, int size) {
+        ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data.getImagePath()).placeHolder(R.drawable.placeholder).build();
+        ImageLoaderManager.getInstance().loadImage(options);
+        mTextView.setText(data.getTitle());
     }
 }
 ```
-**为防止内存泄露在onDestroy()中停止图片轮播**
+
+### 5.BannerViewPager参数配置
+
+```
+    private BannerViewPager<BannerData, NetViewHolder> mBannerViewPager;
+    ...
+	private void initViewPager() {
+             mBannerViewPager = findViewById(R.id.banner_view);
+             mBannerViewPager.showIndicator(true)
+                .setInterval(3000)
+                .setCanLoop(false)
+                .setAutoPlay(true)
+                .setRoundCorner(DpUtils.dp2px(7))
+                .setIndicatorColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))
+                .setIndicatorGravity(IndicatorGravity.END)
+                .setScrollDuration(1000).setHolderCreator(NetViewHolder::new)
+                .setOnPageClickListener(position -> {
+                    BannerData bannerData = mBannerViewPager.getList().get(position);
+                    Toast.makeText(NetworkBannerActivity.this,
+                            "点击了图片" + position + " " + bannerData.getDesc(), Toast.LENGTH_SHORT).show();
+
+                }).create(mList);
+        }
+```
+### 6.开启与停止轮播
+
+***2.5.0之后版本无需自行在Activity或Fragment中管理stopLoop和startLoop方法,但这两个方法依旧保留对外开发***
+
+~~如果开启了自动轮播功能,请务必在onDestroy中停止轮播,以免出现内存泄漏。~~
+
 ```
 	@Override
     protected void onDestroy() {
-    	mViewpager.stopLoop();
         super.onDestroy();
+        if (mBannerViewPager != null)
+    		mViewpager.stopLoop();
+    }
+```
+~~为了节省性能也可以在onStop中停止轮播,在onResume中开启轮播:~~
+
+```
+    @Override
+    protected void onStop() {
+        super.onStop();
+        if (mBannerViewPager != null)
+            mBannerViewPager.stopLoop();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mBannerViewPager != null)
+            mBannerViewPager.startLoop();
     }
 ```
 
+### 7.高级功能---自定义IndicatorView
+
+在内置Indicator不满足需求时可以通过自定义IndicatorView实现。
+
+**(1)自定义View并继承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)设置自定义指示器**
+
+```
+    FigureIndicatorView indicatorView = new FigureIndicatorView(mContext);
+    indicatorView.setRadius(BannerUtils.dp2px(18));
+    indicatorView.setTextSize(BannerUtils.dp2px(13));
+    indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
+
+    mViewPager.setIndicatorGravity(IndicatorGravity.END)
+              .setIndicatorView(indicatorView)
+              .setHolderCreator(() -> new ImageResourceViewHolder(0))
+              .create(mDrawableList);
+```
+
+## TODO 版本计划
+
+ - [x] 优化及重构IndicatorView(2.0.1)
+
+ - [x] 修复2.1.0以前版本循环滑动时第一张切换卡顿问题(2.1.0.1)
+
+ - [x] 增加页面滑动动画(2.1.2)
+
+ - [x] 迁移AndroidX(2.2.0)
+
+ - [x] 增加IndicatorView的滑动样式(2.2.2)
+
+ - [x] 增添更多Indicator样式(2.3.+)
+ - [x] 支持一屏显示多页 (2.4.0)
+ - [x] v2.4.3版本着重优化提升性能
+ - [ ] v2.5.0优化整理Indicator,尽量修复Indicator SMOOTH模式下滑动问题
+ - [ ] ViewPager更换为ViewPager2 (3.0.0)
+ - [ ] 目前Indicator部分代码比较乱,还有很大很大的优化空间,后续版本将持续优化
+ 
+
+
+##  更多详情请参看以下链接
+
+[《打造一个丝滑般自动轮播无限循环Android库》](https://juejin.im/post/5d6bce24f265da03db0790d1)
+[《BannerViewPager源码解析》](https://juejin.im/post/5d74d3faf265da03b5747015)
+
+
+## 感谢
+
+[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
 
-## TODO 接下来的版本计划
+       http://www.apache.org/licenses/LICENSE-2.0
 
-~~(1)目前版本循环滑动时会出现偶尔划不动的情况,会在后续版本中修复~~ (2.1.0.1 已修复)
+    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)优化及重构IndicatorView,增加IndicatorView的滑动样式。
 
-(3)增加页面滑动动画。
 
-(4)ViewPager更换为ViewPager2
 
-(5)如有问题欢迎提issue,该库会持续更新优化。
 
 
-[详情请点击此处](http://blog.csdn.net/qq_20521573/article/details/52037929)

+ 5 - 1
app/build.gradle

@@ -13,7 +13,7 @@ android {
     }
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
@@ -53,4 +53,8 @@ dependencies {
     implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-2'
     implementation project(path: ':ideahttp')
+//    implementation ('com.jakewharton:butterknife:9.0.0') {
+//        exclude module: 'appcompat-v7'
+//    }
+//    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
 }

+ 11 - 0
app/proguard-rules.pro

@@ -15,3 +15,14 @@
 #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 #   public *;
 #}
+
+-keep class android.support.v4.app.Fragment {
+    public void setUserVisibleHint(boolean);
+    public void onHiddenChanged(boolean);
+    public void onResume();
+    public void onPause();
+}
+-keep public class * extends android.app.Activity
+-keep class com.example.zhpan.circleviewpager.bean.** { *; }
+-keep class com.example.zhpan.circleviewpager.net.** { *; }
+-keep class com.zhpan.idea.** { *; }

+ 0 - 26
app/src/androidTest/java/com/example/zhpan/circleviewpager/ExampleInstrumentedTest.java

@@ -1,26 +0,0 @@
-package com.example.zhpan.circleviewpager;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
-    @Test
-    public void useAppContext() throws Exception {
-        // Context of the app under test.
-        Context appContext = InstrumentationRegistry.getTargetContext();
-
-        assertEquals("com.example.zhpan.circleviewpager", appContext.getPackageName());
-    }
-}

+ 10 - 5
app/src/main/AndroidManifest.xml

@@ -12,11 +12,9 @@
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".activity.PageTransformerActivity"/>
-        <activity android:name=".activity.NetworkBannerActivity" />
-        <activity android:name=".activity.CustomerBannerActivity" />
-        <activity android:name=".activity.BannerPhotoViewActivity" />
-        <activity android:name=".activity.MainActivity">
+        <activity
+            android:name=".activity.WelcomeActivity"
+            android:theme="@style/FullScreenTheme" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.VIEW" />
@@ -24,6 +22,13 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name=".activity.PhotoViewActivity"
+            android:theme="@style/FullScreenTheme" />
+        <activity android:name=".activity.MainActivity">
+
+        </activity>
     </application>
 
 </manifest>

+ 0 - 3
app/src/main/java/com/example/zhpan/circleviewpager/App.java

@@ -6,9 +6,6 @@ import com.example.zhpan.circleviewpager.imageloader.GlideImageLoader;
 import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
 import com.zhpan.idea.utils.Utils;
 
-import leakcanary.AppWatcher;
-import leakcanary.LeakCanary;
-
 /**
  * <pre>
  *   Created by zhangpan on 2019-08-14.

+ 0 - 51
app/src/main/java/com/example/zhpan/circleviewpager/activity/BannerPhotoViewActivity.java

@@ -1,51 +0,0 @@
-package com.example.zhpan.circleviewpager.activity;
-
-import android.graphics.Color;
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.widget.Toast;
-
-import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.viewholder.PhotoViewHolder;
-import com.zhpan.bannerview.BannerViewPager;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class BannerPhotoViewActivity extends AppCompatActivity {
-    private List<Integer> mDrawableList = new ArrayList<>();
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_banner_photo_view);
-        setTitle(R.string.wrapper_photo_view);
-        initData();
-        initViewPager();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        //  没有开启自动轮播,不需要stopLoop
-    }
-
-    private void initViewPager() {
-        BannerViewPager<Integer, PhotoViewHolder> bannerViewPager = findViewById(R.id.viewpager);
-        bannerViewPager.setAutoPlay(false)
-                .setCanLoop(false)
-                .setIndicatorColor(Color.parseColor("#6C6D72"), Color.parseColor("#18171C"))
-                .setHolderCreator(PhotoViewHolder::new)
-                .setOnPageClickListener(position ->
-                        Toast.makeText(BannerPhotoViewActivity.this,
-                                "图片" + (position + 1), Toast.LENGTH_SHORT).show())
-                .create(mDrawableList);
-    }
-
-    private void initData() {
-        for (int i = 0; i <= 3; i++) {
-            int drawable2 = getResources().getIdentifier("c" + i, "drawable", getPackageName());
-            mDrawableList.add(drawable2);
-        }
-    }
-}

+ 26 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java

@@ -0,0 +1,26 @@
+package com.example.zhpan.circleviewpager.activity;
+
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class BaseDataActivity extends AppCompatActivity {
+
+    protected List<Integer> mDrawableList = new ArrayList<>();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initData();
+    }
+
+    private void initData() {
+        for (int i = 0; i <= 2; i++) {
+            int drawable = getResources().getIdentifier("guide" + i, "drawable", getPackageName());
+            mDrawableList.add(drawable);
+        }
+    }
+}

+ 0 - 62
app/src/main/java/com/example/zhpan/circleviewpager/activity/CustomerBannerActivity.java

@@ -1,62 +0,0 @@
-package com.example.zhpan.circleviewpager.activity;
-
-import android.graphics.Color;
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.widget.Toast;
-
-import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.bean.CustomBean;
-import com.example.zhpan.circleviewpager.viewholder.CustomPageViewHolder;
-import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.constants.IndicatorGravity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CustomerBannerActivity extends AppCompatActivity {
-    private List<CustomBean> mList = new ArrayList<>();
-    private BannerViewPager<CustomBean, CustomPageViewHolder> mViewPager;
-    private String[] picUrls = {"http://pic31.nipic.com/20130801/11604791_100539834000_2.jpg",
-            "http://pic37.nipic.com/20140115/7430301_100825571157_2.jpg",
-            "http://pic29.nipic.com/20130507/8952533_183922555000_2.jpg",
-            "http://b-ssl.duitang.com/uploads/item/201706/10/20170610095055_G5LM8.jpeg"};
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_customer_banner);
-        setTitle(R.string.title_custom_page);
-        initData();
-        initViewPager();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mViewPager.stopLoop();
-    }
-
-    private void initViewPager() {
-        mViewPager = findViewById(R.id.viewpager);
-        mViewPager.setAutoPlay(true)
-                .setCanLoop(true)
-                .setRoundCorner((int) getResources().getDimension(R.dimen.banner_corner))
-                .setIndicatorRadius(10)
-                .setIndicatorGravity(IndicatorGravity.END)
-                .setIndicatorColor(Color.parseColor("#6C6D72"),
-                        Color.parseColor("#FFFFFF"))
-                .setOnPageClickListener(position -> Toast.makeText(CustomerBannerActivity.this,
-                        "图片" + (position + 1), Toast.LENGTH_SHORT).show())
-                .setHolderCreator(CustomPageViewHolder::new).create(mList);
-    }
-
-    private void initData() {
-
-        for (int i = 0; i < picUrls.length; i++) {
-            CustomBean customBean = new CustomBean();
-            customBean.setImgUrl(picUrls[i]);
-            customBean.setImageDescription("这是第" + (i + 1) + "张图片的描述");
-            mList.add(customBean);
-        }
-    }
-}

+ 65 - 21
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java

@@ -1,44 +1,88 @@
 package com.example.zhpan.circleviewpager.activity;
 
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+
+
+import android.support.v4.view.ViewPager;
 import android.support.v7.app.AppCompatActivity;
-import android.view.View;
+import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.adapter.AdapterFragmentPager;
+import com.zhpan.bannerview.view.CatchViewPager;
 
 
 public class MainActivity extends AppCompatActivity {
-    private String[] picUrls = {"http://pic31.nipic.com/20130801/11604791_100539834000_2.jpg",
-            "http://pic37.nipic.com/20140115/7430301_100825571157_2.jpg",
-            "http://pic29.nipic.com/20130507/8952533_183922555000_2.jpg",
-            "http://b-ssl.duitang.com/uploads/item/201706/10/20170610095055_G5LM8.jpeg"};
+
+    RadioGroup rgTab;
+    CatchViewPager mViewPager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
+        rgTab = findViewById(R.id.rg_tab);
+        mViewPager = findViewById(R.id.vp_fragment);
+        initData();
+        setListener();
     }
 
-    public void onClick(View view) {
-        Intent intent;
-        switch (view.getId()) {
-            case R.id.btn_view_pager2:
-                intent = new Intent(this, CustomerBannerActivity.class);
-                break;
-            case R.id.btn_view_pager3:
-                intent = new Intent(this, BannerPhotoViewActivity.class);
-                break;
-            case R.id.btn_view_pager4:
-                intent = new Intent(this, NetworkBannerActivity.class);
+    private void initData() {
+        AdapterFragmentPager mAdapter = new AdapterFragmentPager(getSupportFragmentManager());
+        mViewPager.setAdapter(mAdapter);
+        mViewPager.disableTouchScroll(true);
+        mViewPager.setOffscreenPageLimit(2);
+        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                rgTab.check(getCheckedId(position));
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
+    }
+
+    private int getCheckedId(int position) {
+        int checkedId = R.id.rb_home;
+        switch (position) {
+            case 0:
+                checkedId = R.id.rb_home;
                 break;
-            case R.id.btn_view_pager5:
-                intent = new Intent(this, PageTransformerActivity.class);
+            case 1:
+                checkedId = R.id.rb_find;
                 break;
-            default:
-                intent = new Intent(this, CustomerBannerActivity.class);
+            case 2:
+                checkedId = R.id.rb_add;
                 break;
         }
-        startActivity(intent);
+        return checkedId;
+    }
+
+    private void setListener() {
+        rgTab.setOnCheckedChangeListener((group, checkedId) -> {
+            if (checkedId == R.id.rb_home) {
+                mViewPager.setCurrentItem(AdapterFragmentPager.PAGE_HOME, false);
+
+            } else if (checkedId == R.id.rb_find) {
+                mViewPager.setCurrentItem(AdapterFragmentPager.PAGE_FIND, false);
+
+            } else if (checkedId == R.id.rb_add) {
+                mViewPager.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, false);
+            }
+        });
+    }
+
+    public static void start(Context context) {
+        context.startActivity(new Intent(context, MainActivity.class));
     }
 }

+ 0 - 81
app/src/main/java/com/example/zhpan/circleviewpager/activity/PageTransformerActivity.java

@@ -1,81 +0,0 @@
-package com.example.zhpan.circleviewpager.activity;
-
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.Toast;
-
-import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.viewholder.TransformerViewHolder;
-import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.constants.TransformerStyle;
-
-import java.util.ArrayList;
-
-public class PageTransformerActivity extends AppCompatActivity {
-
-    private BannerViewPager<Integer, TransformerViewHolder> mViewpager;
-    private ArrayList<Integer> mList = new ArrayList<>();
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_page_transformer);
-        setTitle(R.string.title_transformer);
-        initData();
-        initViewPager();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.transformer_menu, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.menu0:
-                mViewpager.setPageTransformerStyle(TransformerStyle.STACK);
-                break;
-            case R.id.menu1:
-                mViewpager.setPageTransformerStyle(TransformerStyle.ROTATE);
-                break;
-            case R.id.menu2:
-                mViewpager.setPageTransformerStyle(TransformerStyle.DEPTH);
-                break;
-            case R.id.menu3:
-                mViewpager.setPageTransformerStyle(TransformerStyle.ACCORDION);
-                break;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    private void initViewPager() {
-        mViewpager = findViewById(R.id.viewpager);
-        mViewpager.showIndicator(false)
-                .setCanLoop(false)
-                .setAutoPlay(false)
-                .setScrollDuration(1000)
-                .setHolderCreator(TransformerViewHolder::new)
-                .setOnPageClickListener(position -> Toast.makeText(PageTransformerActivity.this,
-                        "立即体验", Toast.LENGTH_SHORT).show())
-                .create(mList);
-    }
-
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mViewpager.stopLoop();
-    }
-
-    private void initData() {
-        mList = new ArrayList<>();
-        for (int i = 0; i <= 2; i++) {
-            int drawable = getResources().getIdentifier("guide" + i, "drawable", getPackageName());
-            mList.add(drawable);
-        }
-    }
-}

+ 30 - 0
app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.java

@@ -0,0 +1,30 @@
+package com.example.zhpan.circleviewpager.activity;
+
+
+import android.os.Bundle;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.viewholder.PhotoViewHolder;
+import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.constants.IndicatorSlideMode;
+
+public class PhotoViewActivity extends BaseDataActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_banner_photo_view);
+        setTitle(R.string.wrapper_photo_view);
+        initViewPager();
+    }
+
+    private void initViewPager() {
+        BannerViewPager<Integer, PhotoViewHolder> bannerViewPager = findViewById(R.id.viewpager);
+        bannerViewPager.setAutoPlay(false)
+                .setCanLoop(false)
+                .setHolderCreator(PhotoViewHolder::new)
+                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                .create(mDrawableList);
+        bannerViewPager.setCurrentItem(1);
+    }
+}

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

@@ -0,0 +1,118 @@
+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.TextView;
+import android.widget.Toast;
+
+import com.example.zhpan.circleviewpager.R;
+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.IndicatorSlideMode;
+import com.zhpan.bannerview.constants.TransformerStyle;
+import com.zhpan.bannerview.holder.HolderCreator;
+import com.zhpan.bannerview.utils.BannerUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+
+public class WelcomeActivity extends BaseDataActivity implements
+        HolderCreator<CustomPageViewHolder> {
+
+    private BannerViewPager<CustomBean, CustomPageViewHolder> mViewPager;
+
+    private String[] des = {"在这里\n你可以听到周围人的心声", "在这里\nTA会在下一秒遇见你", "在这里\n不再错过可以改变你一生的人"};
+
+    private int[] transforms = {TransformerStyle.NONE, TransformerStyle.ACCORDION, TransformerStyle.STACK, TransformerStyle.DEPTH, TransformerStyle.ROTATE};
+
+    TextView mTvStart;
+
+    TextView mTvDescription;
+
+    private static final int ANIMATION_DURATION = 1300;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_welcome);
+        mTvStart = findViewById(R.id.btn_start);
+        mTvDescription = findViewById(R.id.tv_describe);
+        setupViewPager();
+        updateUI(0);
+    }
+
+    private void setupViewPager() {
+        mViewPager = findViewById(R.id.viewpager);
+        mViewPager.setAutoPlay(false)
+                .setCanLoop(false)
+                .setPageTransformerStyle(transforms[new Random().nextInt(5)])
+                .setScrollDuration(ANIMATION_DURATION)
+                .setIndicatorMargin(0, 0, 0, BannerUtils.dp2px(100))
+                .setIndicatorGap((int) getResources().getDimension(R.dimen.dp_10))
+                .setIndicatorColor(getResources().getColor(R.color.white),
+                        getResources().getColor(R.color.white_alpha_75))
+                .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                .setIndicatorRadius((int) getResources().getDimension(R.dimen.dp_3), (int) getResources().getDimension(R.dimen.dp_4_5))
+                .setOnPageChangeListener(new OnPageChangeListenerAdapter() {
+                    @Override
+                    public void onPageSelected(int position) {
+                        updateUI(position);
+                    }
+                })
+                .setHolderCreator(this)
+                .create(getData());
+    }
+
+    public void onClick(View view) {
+        MainActivity.start(WelcomeActivity.this);
+        finish();
+    }
+
+    private void updateUI(int position) {
+        mTvDescription.setText(des[position]);
+        ObjectAnimator translationAnim = ObjectAnimator.ofFloat(mTvDescription, "translationX", -120, 0);
+        translationAnim.setDuration(ANIMATION_DURATION);
+        translationAnim.setInterpolator(new DecelerateInterpolator());
+        ObjectAnimator alphaAnimator1 = ObjectAnimator.ofFloat(mTvDescription, "alpha", 0, 1);
+        alphaAnimator1.setDuration(ANIMATION_DURATION);
+        AnimatorSet animatorSet = new AnimatorSet();
+        animatorSet.playTogether(translationAnim, alphaAnimator1);
+        animatorSet.start();
+
+        if (position == mViewPager.getList().size() - 1 && mTvStart.getVisibility() == View.GONE) {
+            mTvStart.setVisibility(View.VISIBLE);
+            ObjectAnimator
+                    .ofFloat(mTvStart, "alpha", 0, 1)
+                    .setDuration(ANIMATION_DURATION).start();
+        } else {
+            mTvStart.setVisibility(View.GONE);
+        }
+    }
+
+    private List<CustomBean> getData() {
+        List<CustomBean> list = new ArrayList<>();
+        for (int i = 0; i < mDrawableList.size(); i++) {
+            CustomBean customBean = new CustomBean();
+            customBean.setImageRes(mDrawableList.get(i));
+            customBean.setImageDescription(des[i]);
+            list.add(customBean);
+        }
+        return list;
+    }
+
+    @Override
+    public CustomPageViewHolder createViewHolder() {
+        CustomPageViewHolder customPageViewHolder = new CustomPageViewHolder();
+        customPageViewHolder.setOnSubViewClickListener((view, position) ->
+                Toast.makeText(WelcomeActivity.this, "Logo Clicked,Item: " + position, Toast.LENGTH_SHORT).show());
+        return customPageViewHolder;
+    }
+}

+ 62 - 0
app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.java

@@ -0,0 +1,62 @@
+package com.example.zhpan.circleviewpager.adapter;
+
+import android.support.annotation.NonNull;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.util.SparseArray;
+import android.view.ViewGroup;
+
+
+
+import com.example.zhpan.circleviewpager.fragment.BaseFragment;
+import com.example.zhpan.circleviewpager.fragment.IndicatorFragment;
+import com.example.zhpan.circleviewpager.fragment.PageFragment;
+import com.example.zhpan.circleviewpager.fragment.HomeFragment;
+
+public class AdapterFragmentPager extends FragmentPagerAdapter {
+
+    public static final int PAGE_HOME = 0;
+
+    public static final int PAGE_FIND = 1;
+
+    public static final int PAGE_OTHERS = 2;
+
+    private SparseArray<BaseFragment> fragmentList;
+
+    public AdapterFragmentPager(FragmentManager fm) {
+        super(fm);
+        fragmentList = getFragments();
+    }
+
+    private SparseArray<BaseFragment> getFragments() {
+        SparseArray<BaseFragment> fragmentList = new SparseArray<>();
+        fragmentList.put(PAGE_HOME, HomeFragment.getInstance());
+        fragmentList.put(PAGE_FIND, PageFragment.getInstance());
+        fragmentList.put(PAGE_OTHERS, IndicatorFragment.getInstance());
+        return fragmentList;
+    }
+
+    @NonNull
+    @Override
+    public Object instantiateItem(@NonNull ViewGroup container, int position) {
+        Fragment fragment = (Fragment) super.instantiateItem(container, position);
+        fragmentList.put(position, (BaseFragment) fragment);
+        return fragment;
+    }
+
+    @Override
+    public Fragment getItem(int position) {
+        return fragmentList.get(position);
+    }
+
+    @Override
+    public int getCount() {
+        if (fragmentList != null) {
+            return fragmentList.size();
+        } else {
+            return 0;
+        }
+    }
+
+}

+ 1 - 0
app/src/main/java/com/example/zhpan/circleviewpager/bean/CustomBean.java

@@ -1,5 +1,6 @@
 package com.example.zhpan.circleviewpager.bean;
 
+
 import android.support.annotation.DrawableRes;
 
 public class CustomBean {

+ 5 - 10
app/src/main/java/com/example/zhpan/circleviewpager/bean/DataWrapper.java

@@ -10,22 +10,17 @@ public class DataWrapper {
 
     private List<BannerData> dataBeanList;
 
-    public List<BannerData> getDataBeanList() {
-        return dataBeanList;
-    }
-
-    public void setDataBeanList(List<BannerData> dataBeanList) {
+    public DataWrapper(List<ArticleWrapper.Article> articleList, List<BannerData> dataBeanList) {
+        this.articleList = articleList;
         this.dataBeanList = dataBeanList;
     }
 
+    public List<BannerData> getDataBeanList() {
+        return dataBeanList;
+    }
 
     public List<ArticleWrapper.Article> getArticleList() {
         return articleList;
     }
 
-    public void setArticleList(List<ArticleWrapper.Article> articleList) {
-        this.articleList = articleList;
-    }
-
-
 }

+ 84 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/BaseFragment.java

@@ -0,0 +1,84 @@
+package com.example.zhpan.circleviewpager.fragment;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+import com.trello.rxlifecycle2.components.support.RxFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * MVC模式的Base fragment
+ */
+public abstract class BaseFragment extends RxFragment {
+    protected List<Integer> mDrawableList = new ArrayList<>();
+    protected Context mContext;
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        this.mContext = context.getApplicationContext();
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(getLayout(), container, false);
+        initData();
+        initTitle();
+        initView(savedInstanceState, view);
+        return view;
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+    }
+
+    private void initData() {
+        for (int i = 0; i < 4; i++) {
+            int drawable = getResources().getIdentifier("t" + i, "drawable", mContext.getPackageName());
+            mDrawableList.add(drawable);
+        }
+    }
+
+    protected @ColorInt
+    int getColor(@ColorRes int colorRes) {
+        return getContext().getResources().getColor(colorRes);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+
+    /**
+     * 获取当前Activity的UI布局
+     *
+     * @return 布局id
+     */
+    protected abstract int getLayout();
+
+    /**
+     * 初始化标题
+     */
+    protected abstract void initTitle();
+
+    /**
+     * 初始化数据
+     */
+    protected abstract void initView(Bundle savedInstanceState, View view);
+
+}

+ 68 - 39
app/src/main/java/com/example/zhpan/circleviewpager/activity/NetworkBannerActivity.java → app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java

@@ -1,4 +1,4 @@
-package com.example.zhpan.circleviewpager.activity;
+package com.example.zhpan.circleviewpager.fragment;
 
 import android.os.Bundle;
 import android.support.v7.widget.DividerItemDecoration;
@@ -7,6 +7,7 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Toast;
 
+
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.adapter.ArticleAdapter;
 import com.example.zhpan.circleviewpager.bean.ArticleWrapper;
@@ -17,10 +18,10 @@ import com.example.zhpan.circleviewpager.recyclerview.ui.CustomRecyclerView;
 import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
-import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;
 import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.constants.IndicatorGravity;
-import com.zhpan.idea.net.common.DefaultObserver;
+import com.zhpan.bannerview.constants.PageStyle;
+import com.zhpan.bannerview.utils.BannerUtils;
+import com.zhpan.idea.net.common.ResponseObserver;
 import com.zhpan.idea.utils.RxUtil;
 
 import java.util.ArrayList;
@@ -29,7 +30,10 @@ import java.util.List;
 import io.reactivex.Observable;
 import io.reactivex.schedulers.Schedulers;
 
-public class NetworkBannerActivity extends RxAppCompatActivity {
+/**
+ * Created by zhpan on 2018/7/24.
+ */
+public class HomeFragment extends BaseFragment {
 
     private BannerViewPager<BannerData, NetViewHolder> mBannerViewPager;
     private CustomRecyclerView recyclerView;
@@ -37,29 +41,48 @@ public class NetworkBannerActivity extends RxAppCompatActivity {
     private SmartRefreshLayout mSmartRefreshLayout;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_network_banner);
-        setTitle(R.string.load_data);
-        initRefreshLayout();
+    protected int getLayout() {
+        return R.layout.fragment_home;
+    }
+
+    @Override
+    protected void initTitle() {
+
+    }
+
+    @Override
+    protected void initView(Bundle savedInstanceState, View view) {
+        initRecyclerView(view);
+        initRefreshLayout(view);
         initBanner();
         fetchData(true);
     }
 
-    private void initRefreshLayout() {
-        mSmartRefreshLayout = findViewById(R.id.refresh_layout);
-        mSmartRefreshLayout.setRefreshHeader(new MaterialHeader(this));
+    public static HomeFragment getInstance() {
+        return new HomeFragment();
+    }
+
+    private void initRecyclerView(View view) {
+        recyclerView = view.findViewById(R.id.recycler_view);
+        recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
+        recyclerView.addHeadView(getHeaderView());
+        recyclerView.addItemDecoration(new DividerItemDecoration(mContext,
+                DividerItemDecoration.VERTICAL));
+        articleAdapter = new ArticleAdapter(mContext, new ArrayList<>());
+        recyclerView.setAdapter(articleAdapter);
+    }
+
+    private void initRefreshLayout(View view) {
+        mSmartRefreshLayout = view.findViewById(R.id.refresh_layout);
+        mSmartRefreshLayout.setRefreshHeader(new MaterialHeader(mContext));
         mSmartRefreshLayout.setOnRefreshListener(refreshLayout -> fetchData(false));
     }
 
     private void fetchData(boolean showLoading) {
-        Observable.zip(getBannerObserver(), getArticleObserver(), (bannerData, articles) -> {
-            DataWrapper dataWrapper = new DataWrapper();
-            dataWrapper.setArticleList(articles.getDatas());
-            dataWrapper.setDataBeanList(bannerData);
-            return dataWrapper;
-        }).compose(RxUtil.rxSchedulerHelper(this, showLoading))
-                .subscribe(new DefaultObserver<DataWrapper>() {
+        Observable.zip(getBannerObserver(), getArticleObserver(), (bannerData, articles) ->
+                new DataWrapper(articles.getDatas(), bannerData))
+                .compose(RxUtil.rxSchedulerHelper(this, showLoading))
+                .subscribe(new ResponseObserver<DataWrapper>() {
                     @Override
                     public void onSuccess(DataWrapper response) {
                         mBannerViewPager.create(response.getDataBeanList());
@@ -83,34 +106,40 @@ public class NetworkBannerActivity extends RxAppCompatActivity {
     }
 
     private void initBanner() {
-        recyclerView = findViewById(R.id.recycler_view);
-        recyclerView.setLayoutManager(new LinearLayoutManager(this));
-        recyclerView.addHeadView(getHeaderView());
-        recyclerView.addItemDecoration(new DividerItemDecoration(NetworkBannerActivity.this,
-                DividerItemDecoration.VERTICAL));
-        articleAdapter = new ArticleAdapter(this, new ArrayList<>());
-        recyclerView.setAdapter(articleAdapter);
-        mBannerViewPager.showIndicator(true)
-                .setInterval(3000)
-                .setIndicatorGravity(IndicatorGravity.END)
-                .setScrollDuration(1000).setHolderCreator(NetViewHolder::new)
+        mBannerViewPager
+                .setAutoPlay(true)
+                .setInterval(5000)
+                .setRevealWidth(BannerUtils.dp2px(10))
+                .setPageMargin(BannerUtils.dp2px(10))
+                .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setHolderCreator(NetViewHolder::new)
+                .setIndicatorMargin(0,0,0, (int) getResources().getDimension(R.dimen.dp_18))
                 .setOnPageClickListener(position -> {
                     BannerData bannerData = mBannerViewPager.getList().get(position);
-                    Toast.makeText(NetworkBannerActivity.this,
-                            "点击了图片" + position + " " + bannerData.getDesc(), Toast.LENGTH_SHORT).show();
+                    Toast.makeText(mContext,
+                            "点击了position:" + position + " " + bannerData.getTitle(), Toast.LENGTH_SHORT).show();
 
                 });
     }
 
     private View getHeaderView() {
-        View view = LayoutInflater.from(this).inflate(R.layout.item_header_view, recyclerView, false);
+        View view = LayoutInflater.from(mContext).inflate(R.layout.item_header_view, recyclerView, false);
         mBannerViewPager = view.findViewById(R.id.banner_view);
         return view;
     }
 
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mBannerViewPager.stopLoop();
-    }
+//    @Override
+//    public void onStop() {
+//        if (mBannerViewPager != null)
+//            mBannerViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        if (mBannerViewPager != null)
+//            mBannerViewPager.startLoop();
+//        super.onResume();
+//    }
 }

+ 129 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java

@@ -0,0 +1,129 @@
+package com.example.zhpan.circleviewpager.fragment;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
+import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.constants.IndicatorGravity;
+import com.zhpan.bannerview.constants.IndicatorStyle;
+import com.zhpan.bannerview.utils.BannerUtils;
+import com.zhpan.idea.utils.ToastUtils;
+
+/**
+ * Created by zhpan on 2018/7/24.
+ */
+public class IndicatorFragment extends BaseFragment {
+
+    BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    RadioGroup radioGroupStyle;
+    RadioButton radioButton;
+
+    @Override
+    protected int getLayout() {
+        return R.layout.fragment_others;
+    }
+
+    @Override
+    protected void initTitle() {
+
+    }
+
+    @Override
+    protected void initView(Bundle savedInstanceState, View view) {
+        mViewPager = view.findViewById(R.id.banner_view);
+        radioGroupStyle = view.findViewById(R.id.rg_indicator_style);
+        radioButton = view.findViewById(R.id.rb_circle);
+        view.findViewById(R.id.tv_photo_view).setOnClickListener(v -> startActivity(new Intent(getActivity(), PhotoViewActivity.class)));
+        mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
+                .setHolderCreator(() -> new ImageResourceViewHolder(0));
+        initRadioGroup();
+    }
+
+    public static IndicatorFragment getInstance() {
+        return new IndicatorFragment();
+    }
+
+    private void initRadioGroup() {
+        radioGroupStyle.setVisibility(View.VISIBLE);
+        radioGroupStyle.setVisibility(View.VISIBLE);
+        radioGroupStyle.setOnCheckedChangeListener((group, checkedId) -> {
+            switch (checkedId) {
+                case R.id.rb_circle:
+//                    mViewPager.resetIndicator();
+                    setupCircleIndicator();
+                    break;
+                case R.id.rb_dash:
+//                    mViewPager.resetIndicator();
+                    setupDashIndicator();
+                    break;
+                case R.id.rb_custom:
+                    setupCustomIndicator();
+                    break;
+            }
+        });
+        radioButton.performClick();
+    }
+
+    private void setupCircleIndicator() {
+        mViewPager.setIndicatorStyle(IndicatorStyle.CIRCLE)
+                .setIndicatorGravity(IndicatorGravity.CENTER)
+                .setIndicatorGap(BannerUtils.dp2px(6))
+                .setPageMargin(0)
+                .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setIndicatorRadius(BannerUtils.dp2px(4), BannerUtils.dp2px(5)).create(mDrawableList);
+    }
+
+    private void setupDashIndicator() {
+        mViewPager.setIndicatorStyle(IndicatorStyle.DASH)
+                .setIndicatorHeight(BannerUtils.dp2px(3f))
+                .setIndicatorGravity(IndicatorGravity.CENTER)
+                .setIndicatorGap(BannerUtils.dp2px(3))
+                .setPageMargin(0)
+                .setIndicatorWidth(BannerUtils.dp2px(3), BannerUtils.dp2px(10))
+                .setIndicatorColor(Color.parseColor("#888888"),
+                        Color.parseColor("#118EEA")).create(mDrawableList);
+    }
+
+    private void setupCustomIndicator() {
+        mViewPager.setAutoPlay(false).setCanLoop(true)
+                .setPageMargin(BannerUtils.dp2px(20))
+                .setIndicatorGravity(IndicatorGravity.END)
+                .setIndicatorView(setupIndicatorView())
+                .setHolderCreator(() -> new ImageResourceViewHolder(0)).create(mDrawableList);
+    }
+
+    /**
+     * 这里可以是自定义的Indicator,需要继承BaseIndicatorView或者实现IIndicator接口;
+     */
+    private FigureIndicatorView setupIndicatorView() {
+        FigureIndicatorView indicatorView = new FigureIndicatorView(mContext);
+        indicatorView.setRadius(BannerUtils.dp2px(18));
+        indicatorView.setTextSize(BannerUtils.dp2px(13));
+        indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
+        return indicatorView;
+    }
+
+
+//    @Override
+//    public void onStop() {
+//        if (mViewPager != null)
+//            mViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        super.onResume();
+//        if (mViewPager != null)
+//            mViewPager.startLoop();
+//    }
+}

+ 120 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java

@@ -0,0 +1,120 @@
+package com.example.zhpan.circleviewpager.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.zhpan.bannerview.BannerViewPager;
+import com.zhpan.bannerview.annotation.APageStyle;
+import com.zhpan.bannerview.constants.PageStyle;
+import com.zhpan.bannerview.indicator.CircleIndicatorView;
+import com.zhpan.bannerview.utils.BannerUtils;
+import com.zhpan.idea.utils.ToastUtils;
+
+
+/**
+ * Created by zhpan on 2018/7/24.
+ */
+public class PageFragment extends BaseFragment {
+
+    BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    RadioGroup mRadioGroupPageStyle;
+    CircleIndicatorView indicatorView;
+    RadioButton radioButton;
+
+    @Override
+    protected int getLayout() {
+        return R.layout.fragment_find;
+    }
+
+    @Override
+    protected void initTitle() {
+
+    }
+
+    @Override
+    protected void initView(Bundle savedInstanceState, View view) {
+        mViewPager = view.findViewById(R.id.banner_view);
+        mRadioGroupPageStyle = view.findViewById(R.id.rg_page_style);
+        indicatorView = view.findViewById(R.id.indicator_view);
+        radioButton = view.findViewById(R.id.rb_multi_page);
+        mViewPager
+                .setPageMargin(BannerUtils.dp2px(10))
+                .setRevealWidth(BannerUtils.dp2px(10))
+                .setHolderCreator(() -> new ImageResourceViewHolder(BannerUtils.dp2px(5)))
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
+                .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
+                .setInterval(5000);
+        initRadioGroup();
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    public static PageFragment getInstance() {
+        return new PageFragment();
+    }
+
+    private void setupBanner(@APageStyle int pageStyle) {
+        mViewPager
+                .setIndicatorVisibility(View.VISIBLE) // 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                .setPageStyle(pageStyle)
+                .create(mDrawableList);
+    }
+
+    private void initRadioGroup() {
+        mRadioGroupPageStyle.setOnCheckedChangeListener((group, checkedId) -> {
+            switch (checkedId) {
+                case R.id.rb_multi_page:
+//                    mViewPager.resetIndicator();// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                    indicatorView.setVisibility(View.INVISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                    setupBanner(PageStyle.MULTI_PAGE);
+                    break;
+                case R.id.rb_multi_page_scale:
+//                    mViewPager.resetIndicator();// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                    indicatorView.setVisibility(View.INVISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                    setupBanner(PageStyle.MULTI_PAGE_SCALE);
+                    break;
+                case R.id.rb_multi_page_overlap:
+                    indicatorView.setVisibility(View.VISIBLE);// 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+//                    mViewPager.resetIndicator();
+                    setupOverlapBanner();
+                    break;
+            }
+        });
+        radioButton.performClick();
+    }
+
+    private void setupOverlapBanner() {
+        mViewPager
+                .setIndicatorVisibility(View.GONE) // 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
+                .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
+                .setIndicatorView(indicatorView)
+                .create(mDrawableList);
+    }
+
+//    @Override
+//    public void onStop() {
+//        if (mViewPager != null)
+//            mViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        if (mViewPager != null)
+//            mViewPager.startLoop();
+//        super.onResume();
+//    }
+}

+ 4 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/ApiService.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import io.reactivex.Observable;
 import retrofit2.http.GET;
+import retrofit2.http.Headers;
 
 /**
  * <pre>
@@ -14,9 +15,12 @@ import retrofit2.http.GET;
  * </pre>
  */
 public interface ApiService {
+
+    @Headers("Cache-Control: public, max-age=" + 24 * 3600)
     @GET("banner/json")
     Observable<List<BannerData>> getBannerData();
 
+    @Headers("Cache-Control: public, max-age=" + 24 * 3600)
     @GET("article/list/0/json")
     Observable<ArticleWrapper> getArticle();
 }

+ 30 - 0
app/src/main/java/com/example/zhpan/circleviewpager/view/CornerImageView.java

@@ -0,0 +1,30 @@
+package com.example.zhpan.circleviewpager.view;
+
+import android.content.Context;
+import android.os.Build;
+import android.support.v7.widget.AppCompatImageView;
+import android.util.AttributeSet;
+
+
+import com.zhpan.bannerview.provider.ViewStyleSetter;
+
+public class CornerImageView extends AppCompatImageView {
+    public CornerImageView(Context context) {
+        this(context, null);
+    }
+
+    public CornerImageView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CornerImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public void setRoundCorner(int radius) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            ViewStyleSetter viewStyleSetter = new ViewStyleSetter(this);
+            viewStyleSetter.setRoundCorner(radius);
+        }
+    }
+}

+ 80 - 0
app/src/main/java/com/example/zhpan/circleviewpager/view/FigureIndicatorView.java

@@ -0,0 +1,80 @@
+package com.example.zhpan.circleviewpager.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.support.annotation.ColorInt;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+
+
+import com.zhpan.bannerview.indicator.BaseIndicatorView;
+import com.zhpan.bannerview.utils.BannerUtils;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-10-18.
+ *   Description:
+ * </pre>
+ */
+public class FigureIndicatorView extends BaseIndicatorView {
+
+    private int radius = BannerUtils.dp2px(20);
+
+    private int backgroundColor = Color.parseColor("#88FF5252");
+
+    private int textColor = Color.WHITE;
+
+    private int textSize= BannerUtils.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 = getCurrentPosition() + 1 + "/" + getPageSize();
+        int textWidth = (int) mPaint.measureText(text);
+        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
+        int baseline = (getMeasuredHeight() - fontMetricsInt.bottom + fontMetricsInt.top) / 2 - fontMetricsInt.top;
+        canvas.drawText(text, (getWidth() - textWidth) / 2, baseline, mPaint);
+    }
+
+    public void setRadius(int radius) {
+        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;
+    }
+}

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

@@ -1,34 +1,47 @@
 package com.example.zhpan.circleviewpager.viewholder;
 
+import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
-import android.widget.TextView;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.bean.CustomBean;
-import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
-import com.example.zhpan.circleviewpager.imageloader.ImageLoaderOptions;
 import com.zhpan.bannerview.holder.ViewHolder;
 
 public class CustomPageViewHolder implements ViewHolder<CustomBean> {
     private ImageView mImageView;
-    private TextView mTextView;
+    private ImageView mImageStart;
+    private OnSubViewClickListener mOnSubViewClickListener;
 
     @Override
     public View createView(ViewGroup viewGroup, Context context, int position) {
         View view = LayoutInflater.from(context).inflate(R.layout.item_custom_view, viewGroup, false);
         mImageView = view.findViewById(R.id.banner_image);
-        mTextView = view.findViewById(R.id.tv_describe);
+        mImageStart = view.findViewById(R.id.iv_logo);
         return view;
     }
 
     @Override
     public void onBind(Context context, CustomBean data, int position, int size) {
-        ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data.getImgUrl()).placeHolder(R.drawable.placeholder).build();
-        ImageLoaderManager.getInstance().loadImage(options);
-        mTextView.setText(data.getImageDescription());
+        mImageView.setImageResource(data.getImageRes());
+        mImageStart.setOnClickListener(view -> {
+            if (null != mOnSubViewClickListener)
+                mOnSubViewClickListener.onViewClick(view, position);
+        });
+        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageStart, "alpha", 0, 1);
+        alphaAnimator.setDuration(1500);
+        alphaAnimator.start();
+
+    }
+
+    public void setOnSubViewClickListener(OnSubViewClickListener subViewClickListener) {
+        mOnSubViewClickListener = subViewClickListener;
+    }
+
+    public interface OnSubViewClickListener {
+        void onViewClick(View view, int position);
     }
 }

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

@@ -0,0 +1,38 @@
+package com.example.zhpan.circleviewpager.viewholder;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.view.CornerImageView;
+import com.zhpan.bannerview.holder.ViewHolder;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class ImageResourceViewHolder implements ViewHolder<Integer> {
+    private CornerImageView mImageView;
+    private int roundCorner;
+
+    public ImageResourceViewHolder(int roundCorner) {
+        this.roundCorner = roundCorner;
+    }
+
+    @Override
+    public View createView(ViewGroup viewGroup, Context context, int position) {
+        View view = LayoutInflater.from(context).inflate(R.layout.item_slide_mode, viewGroup, false);
+        mImageView = view.findViewById(R.id.banner_image);
+        return view;
+    }
+
+    @Override
+    public void onBind(Context context, Integer data, int position, int size) {
+        mImageView.setImageResource(data);
+        mImageView.setRoundCorner(roundCorner);
+    }
+}

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

@@ -11,7 +11,9 @@ import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
 import com.example.zhpan.circleviewpager.imageloader.ImageLoaderOptions;
 import com.example.zhpan.circleviewpager.net.BannerData;
+import com.example.zhpan.circleviewpager.view.CornerImageView;
 import com.zhpan.bannerview.holder.ViewHolder;
+import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
  * <pre>
@@ -20,14 +22,15 @@ import com.zhpan.bannerview.holder.ViewHolder;
  * </pre>
  */
 public class NetViewHolder implements ViewHolder<BannerData> {
-    ImageView mImageView;
-    TextView mTextView;
+    private CornerImageView mImageView;
+//    private TextView mTextView;
 
     @Override
     public View createView(ViewGroup viewGroup, Context context, int position) {
-        View view = LayoutInflater.from(context).inflate(R.layout.item_custom_view, viewGroup, false);
+        View view = LayoutInflater.from(context).inflate(R.layout.item_net, viewGroup, false);
         mImageView = view.findViewById(R.id.banner_image);
-        mTextView = view.findViewById(R.id.tv_describe);
+//        mTextView = view.findViewById(R.id.tv_describe);
+        mImageView.setRoundCorner(BannerUtils.dp2px(5));
         return view;
     }
 
@@ -35,6 +38,6 @@ public class NetViewHolder implements ViewHolder<BannerData> {
     public void onBind(Context context, BannerData data, int position, int size) {
         ImageLoaderOptions options = new ImageLoaderOptions.Builder().into(mImageView).load(data.getImagePath()).placeHolder(R.drawable.placeholder).build();
         ImageLoaderManager.getInstance().loadImage(options);
-        mTextView.setText(data.getTitle());
+//        mTextView.setText(data.getTitle());
     }
 }

+ 5 - 4
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/TransformerViewHolder.java

@@ -5,31 +5,32 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
+import android.widget.TextView;
 
 import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.bean.DataBean;
-import com.example.zhpan.circleviewpager.imageloader.ImageLoaderManager;
-import com.example.zhpan.circleviewpager.imageloader.ImageLoaderOptions;
 import com.zhpan.bannerview.holder.ViewHolder;
 
 /**
  * Created by zhpan on 2017/10/30.
  * Description:
  */
-
 public class TransformerViewHolder implements ViewHolder<Integer> {
     private ImageView mImageView;
+    private TextView mTextView;
 
     @Override
     public View createView(ViewGroup viewGroup, Context context, int position) {
         // 返回页面布局文件
         View view = LayoutInflater.from(context).inflate(R.layout.item_view, viewGroup, false);
         mImageView = view.findViewById(R.id.banner_image);
+        mTextView = view.findViewById(R.id.btn_start);
+
         return view;
     }
 
     @Override
     public void onBind(final Context context, Integer data, final int position, final int size) {
         mImageView.setImageResource(data);
+        mTextView.setVisibility(View.VISIBLE);
     }
 }

BIN
app/src/main/res/drawable-hdpi/a0.jpeg


BIN
app/src/main/res/drawable-hdpi/a1.jpg


BIN
app/src/main/res/drawable-hdpi/a2.jpeg


BIN
app/src/main/res/drawable-hdpi/a3.jpeg


BIN
app/src/main/res/drawable-hdpi/a4.jpeg


BIN
app/src/main/res/drawable-hdpi/b0.jpg


BIN
app/src/main/res/drawable-hdpi/b1.jpg


BIN
app/src/main/res/drawable-hdpi/b2.jpg


BIN
app/src/main/res/drawable-hdpi/b3.jpg


BIN
app/src/main/res/drawable-hdpi/c0.jpg


BIN
app/src/main/res/drawable-hdpi/c1.jpg


BIN
app/src/main/res/drawable-hdpi/c2.jpg


BIN
app/src/main/res/drawable-hdpi/c3.jpg


BIN
app/src/main/res/drawable-hdpi/c4.jpg


BIN
app/src/main/res/drawable-hdpi/placeholder.jpg


BIN
app/src/main/res/drawable-xhdpi/a0.jpeg


BIN
app/src/main/res/drawable-xhdpi/a1.jpg


BIN
app/src/main/res/drawable-xhdpi/a2.jpeg


BIN
app/src/main/res/drawable-xhdpi/a3.jpeg


BIN
app/src/main/res/drawable-xhdpi/a4.jpeg


BIN
app/src/main/res/drawable-xhdpi/b0.jpg


BIN
app/src/main/res/drawable-xhdpi/b1.jpg


BIN
app/src/main/res/drawable-xhdpi/b2.jpg


BIN
app/src/main/res/drawable-xhdpi/b3.jpg


BIN
app/src/main/res/drawable-xhdpi/c0.jpg


BIN
app/src/main/res/drawable-xhdpi/c1.jpg


BIN
app/src/main/res/drawable-xhdpi/c2.jpg


BIN
app/src/main/res/drawable-xhdpi/c3.jpg


BIN
app/src/main/res/drawable-xhdpi/c4.jpg


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


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


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


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


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


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


BIN
app/src/main/res/drawable-xhdpi/placeholder.jpg


BIN
app/src/main/res/drawable-xxhdpi/a0.jpeg


BIN
app/src/main/res/drawable-xxhdpi/a1.jpg


BIN
app/src/main/res/drawable-xxhdpi/a2.jpeg


BIN
app/src/main/res/drawable-xxhdpi/a3.jpeg


BIN
app/src/main/res/drawable-xxhdpi/a4.jpeg


BIN
app/src/main/res/drawable-xxhdpi/b0.jpg


BIN
app/src/main/res/drawable-xxhdpi/b1.jpg


BIN
app/src/main/res/drawable-xxhdpi/b2.jpg


BIN
app/src/main/res/drawable-xxhdpi/b3.jpg


BIN
app/src/main/res/drawable-xxhdpi/c0.jpg


BIN
app/src/main/res/drawable-xxhdpi/c1.jpg


BIN
app/src/main/res/drawable-xxhdpi/c2.jpg


BIN
app/src/main/res/drawable-xxhdpi/c3.jpg


BIN
app/src/main/res/drawable-xxhdpi/c4.jpg


BIN
app/src/main/res/drawable-xxhdpi/guide0.jpg


BIN
app/src/main/res/drawable-xxhdpi/guide1.jpg


BIN
app/src/main/res/drawable-xxhdpi/guide2.jpg


BIN
app/src/main/res/drawable-xxhdpi/placeholder.jpg


BIN
app/src/main/res/drawable-xxhdpi/t0.jpg


BIN
app/src/main/res/drawable-xxhdpi/t1.jpg


BIN
app/src/main/res/drawable-xxhdpi/t2.jpg


BIN
app/src/main/res/drawable-xxhdpi/t3.jpg


BIN
app/src/main/res/drawable-xxxhdpi/a0.jpeg


BIN
app/src/main/res/drawable-xxxhdpi/a1.jpg


BIN
app/src/main/res/drawable-xxxhdpi/a2.jpeg


BIN
app/src/main/res/drawable-xxxhdpi/a3.jpeg


BIN
app/src/main/res/drawable-xxxhdpi/a4.jpeg


BIN
app/src/main/res/drawable-xxxhdpi/b0.jpg


BIN
app/src/main/res/drawable-xxxhdpi/b1.jpg


BIN
app/src/main/res/drawable-xxxhdpi/b2.jpg


BIN
app/src/main/res/drawable-xxxhdpi/b3.jpg


BIN
app/src/main/res/drawable-xxxhdpi/c0.jpg


BIN
app/src/main/res/drawable-xxxhdpi/c1.jpg


BIN
app/src/main/res/drawable-xxxhdpi/c2.jpg


BIN
app/src/main/res/drawable-xxxhdpi/c3.jpg


BIN
app/src/main/res/drawable-xxxhdpi/c4.jpg


Some files were not shown because too many files changed in this diff