Browse Source

New Api disableTouchScroll (#28)

* Add new API setOnPageSelectedListener.
* New Api disableTouchScroll

* Optimize BannerViewPager

* Fix issue #27

* update sample
zhpanvip 5 years ago
parent
commit
454ee03539
38 changed files with 450 additions and 383 deletions
  1. 9 7
      README.md
  2. 1 1
      app/build.gradle
  3. 11 0
      app/proguard-rules.pro
  4. 4 2
      app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java
  5. 3 2
      app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java
  6. 2 14
      app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.java
  7. 60 29
      app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java
  8. 4 6
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.java
  9. 5 10
      app/src/main/java/com/example/zhpan/circleviewpager/bean/DataWrapper.java
  10. 9 2
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/BaseFragment.java
  11. 10 15
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
  12. 20 19
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java
  13. 19 23
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java
  14. 0 1
      app/src/main/java/com/example/zhpan/circleviewpager/view/CornerImageView.java
  15. 3 3
      app/src/main/java/com/example/zhpan/circleviewpager/view/FigureIndicatorView.java
  16. 4 4
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/CustomPageViewHolder.java
  17. BIN
      app/src/main/res/drawable-xxhdpi/c0.jpg
  18. BIN
      app/src/main/res/drawable-xxhdpi/c1.jpg
  19. BIN
      app/src/main/res/drawable-xxhdpi/c2.jpg
  20. BIN
      app/src/main/res/drawable-xxhdpi/c3.jpg
  21. BIN
      app/src/main/res/drawable-xxhdpi/c4.jpg
  22. 1 1
      app/src/main/res/layout/activity_main.xml
  23. 14 0
      app/src/main/res/layout/activity_welcome.xml
  24. 2 15
      app/src/main/res/layout/item_custom_view.xml
  25. 1 2
      app/src/main/res/layout/item_header_view.xml
  26. 3 0
      app/src/main/res/values/colors.xml
  27. 6 14
      app/src/main/res/values/strings.xml
  28. 107 125
      bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
  29. 13 46
      bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java
  30. 21 0
      bannerview/src/main/java/com/zhpan/bannerview/adapter/OnPageChangeListenerAdapter.java
  31. 2 2
      bannerview/src/main/java/com/zhpan/bannerview/indicator/BaseIndicatorView.java
  32. 50 0
      bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java
  33. 0 36
      bannerview/src/main/java/com/zhpan/bannerview/utils/DpUtils.java
  34. 48 0
      bannerview/src/main/java/com/zhpan/bannerview/utils/PositionUtils.java
  35. 16 1
      bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java
  36. 1 2
      bannerview/src/main/res/layout/layout_banner_view_pager.xml
  37. BIN
      download/app.apk
  38. 1 1
      ideahttp/src/main/java/com/zhpan/idea/net/common/ResponseObserver.java

+ 9 - 7
README.md

@@ -14,7 +14,7 @@
 
 ### 1.setPageStyle
 
-[一屏多页Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/PageStyleActivity.java)
+[一屏多页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 |
 |--|--|--|
@@ -23,7 +23,7 @@
 ### 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/activity/IndicatorStyleActivity.java)
+[IndicatorViewStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java)
 
 | CIRCLE | DASH | Custom |
 |--|--|--|
@@ -38,7 +38,7 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 
 ### 4.setPageTransformerStyle
 
-[TransformStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/PageTransformerActivity.java)
+[TransformStyle Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java)
 
 | 参数 | STACK | ROTATE | DEPTH | ACCORDION |
 |--|--|--|--|--|
@@ -68,13 +68,14 @@ BannerViewPager支持多种IndicatorViewStyle,同时还提供了完全自定义I
 | 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) | 设置自定义指示器| 设置自定义指示器后以上关于IndicatorView的参数会部分失效|
+| BannerViewPager<T, VH> setIndicatorView(IIndicator indicatorView) | 设置自定义指示器| |
 | BannerViewPager<T, VH> setPageTransformerStyle(int style) | 设置页面Transformer内置样式 |  |
 | BannerViewPager<T, VH> setCurrentItem(int item) | Set the currently selected page. | 2.3.5新增 |
 | void 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中的集合数据 |  |
@@ -142,7 +143,7 @@ implementation 'com.zhpan.library:bannerview:latestVersion'
             android:layout_height="160dp" />
 ```
 
-### 3.Banner的页面布局
+### 3.Banner的Item页面布局
 
 ```
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -335,8 +336,9 @@ public class FigureIndicatorView extends BaseIndicatorView {
  - [x] 增加IndicatorView的滑动样式(2.2.2)
 
  - [x] 增添更多Indicator样式(2.3.+)
- - [x]  支持一屏显示多页 (2.4.0)
- - [ ]  ViewPager更换为ViewPager2 (3.0.0)
+ - [x] 支持一屏显示多页 (2.4.0)
+ - [ ] 将v2.4.3版本中着重优化提升性能
+ - [ ] ViewPager更换为ViewPager2 (3.0.0)
  - [ ] 目前Indicator部分代码比较乱,还有很大很大的优化空间,后续版本将持续优化
  
 

+ 1 - 1
app/build.gradle

@@ -13,7 +13,7 @@ android {
     }
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }

+ 11 - 0
app/proguard-rules.pro

@@ -15,3 +15,14 @@
 #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 #   public *;
 #}
+
+-keep class * extends androidx.fragment.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.** { *; }

+ 4 - 2
app/src/main/java/com/example/zhpan/circleviewpager/activity/BaseDataActivity.java

@@ -8,7 +8,9 @@ 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);
@@ -16,8 +18,8 @@ public abstract class BaseDataActivity extends AppCompatActivity {
     }
 
     private void initData() {
-        for (int i = 0; i <= 3; i++) {
-            int drawable = getResources().getIdentifier("t" + i, "drawable", getPackageName());
+        for (int i = 0; i <= 2; i++) {
+            int drawable = getResources().getIdentifier("guide" + i, "drawable", getPackageName());
             mDrawableList.add(drawable);
         }
     }

+ 3 - 2
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.java

@@ -11,6 +11,7 @@ import android.widget.RadioGroup;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.adapter.AdapterFragmentPager;
+import com.zhpan.bannerview.view.CatchViewPager;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
@@ -21,7 +22,7 @@ public class MainActivity extends AppCompatActivity {
     @BindView(R.id.rg_tab)
     RadioGroup rgTab;
     @BindView(R.id.vp_fragment)
-    ViewPager mViewPager;
+    CatchViewPager mViewPager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -35,6 +36,7 @@ public class MainActivity extends AppCompatActivity {
     private void initData() {
         AdapterFragmentPager mAdapter = new AdapterFragmentPager(getSupportFragmentManager());
         mViewPager.setAdapter(mAdapter);
+        mViewPager.disableTouchScroll(true);
         mViewPager.setOffscreenPageLimit(2);
         mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
             @Override
@@ -87,5 +89,4 @@ public class MainActivity extends AppCompatActivity {
     public static void start(Context context) {
         context.startActivity(new Intent(context, MainActivity.class));
     }
-
 }

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

@@ -1,25 +1,20 @@
 package com.example.zhpan.circleviewpager.activity;
 
-import androidx.appcompat.app.AppCompatActivity;
 
 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;
 
-import java.util.ArrayList;
-import java.util.List;
-
-public class PhotoViewActivity extends AppCompatActivity {
-    private List<Integer> mDrawableList = new ArrayList<>();
+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);
-        initData();
         initViewPager();
     }
 
@@ -32,11 +27,4 @@ public class PhotoViewActivity extends AppCompatActivity {
                 .create(mDrawableList);
         bannerViewPager.setCurrentItem(1);
     }
-
-    private void initData() {
-        for (int i = 0; i <= 3; i++) {
-            int drawable2 = getResources().getIdentifier("c" + i, "drawable", getPackageName());
-            mDrawableList.add(drawable2);
-        }
-    }
 }

+ 60 - 29
app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.java

@@ -1,81 +1,112 @@
 package com.example.zhpan.circleviewpager.activity;
 
 
-import androidx.appcompat.app.AppCompatActivity;
-
-import android.content.Intent;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
 import android.os.Bundle;
 import android.view.View;
+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.indicator.CircleIndicatorView;
-import com.zhpan.bannerview.indicator.IIndicator;
+import com.zhpan.bannerview.holder.HolderCreator;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-public class WelcomeActivity extends AppCompatActivity {
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class WelcomeActivity extends BaseDataActivity implements
+        HolderCreator<CustomPageViewHolder> {
 
     private BannerViewPager<CustomBean, CustomPageViewHolder> mViewPager;
-    private int[] imgRes = {R.drawable.guide0, R.drawable.guide1, R.drawable.guide2};
+
     private String[] des = {"在这里\n你可以听到周围人的心声", "在这里\nTA会在下一秒遇见你", "在这里\n不再错过可以改变你一生的人"};
+
     private int[] transforms = {TransformerStyle.NONE, TransformerStyle.ACCORDION, TransformerStyle.STACK, TransformerStyle.DEPTH, TransformerStyle.ROTATE};
 
+    @BindView(R.id.btn_start)
+    TextView mTvStart;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_welcome);
-        getData();
+        ButterKnife.bind(this);
         setupViewPager();
     }
 
     @Override
     protected void onDestroy() {
-        super.onDestroy();
         mViewPager.stopLoop();
+        super.onDestroy();
     }
 
     private void setupViewPager() {
         mViewPager = findViewById(R.id.viewpager);
         mViewPager.setAutoPlay(false)
                 .setCanLoop(false)
-                .setPageTransformerStyle(transforms[new Random().nextInt(4)])
+                .setPageTransformerStyle(transforms[new Random().nextInt(5)])
                 .setIndicatorVisibility(View.GONE)
-                .setIndicatorView(getIndicatorView())
-                .setHolderCreator(() -> {
-                    CustomPageViewHolder customPageViewHolder = new CustomPageViewHolder();
-                    customPageViewHolder.setOnSubViewClickListener((view, position) -> {
-                        MainActivity.start(WelcomeActivity.this);
-                        finish();
-                    });
-                    return customPageViewHolder;
-                }).create(getData());
+                .setIndicatorView(findViewById(R.id.indicator))
+                .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) {
+                        showStartButton(position);
+                    }
+                })
+                .setHolderCreator(this)
+                .create(getData());
     }
 
-    private IIndicator getIndicatorView() {
-        CircleIndicatorView indicatorView = findViewById(R.id.indicator);
-        indicatorView.setNormalColor(getResources().getColor(R.color.white));
-        indicatorView.setCheckedColor(getResources().getColor(R.color.white_alpha_75));
-        indicatorView.setIndicatorWidth((int) getResources().getDimension(R.dimen.dp_6),
-                (int) getResources().getDimension(R.dimen.dp_9));
-        indicatorView.setIndicatorGap((int) getResources().getDimension(R.dimen.dp_10));
-        return indicatorView;
+    @OnClick(R.id.btn_start)
+    public void onClick(View view) {
+        MainActivity.start(WelcomeActivity.this);
+        finish();
+    }
+
+    private void showStartButton(int position) {
+        if (position == mViewPager.getList().size() - 1 && mTvStart.getVisibility() == View.GONE) {
+            mTvStart.setVisibility(View.VISIBLE);
+            ObjectAnimator
+                    .ofFloat(mTvStart, "alpha", 0, 1)
+                    .setDuration(1500).start();
+        } else {
+            mTvStart.setVisibility(View.GONE);
+        }
     }
 
     private List<CustomBean> getData() {
         List<CustomBean> list = new ArrayList<>();
-        for (int i = 0; i < imgRes.length; i++) {
+        for (int i = 0; i < mDrawableList.size(); i++) {
             CustomBean customBean = new CustomBean();
-            customBean.setImageRes(imgRes[i]);
+            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;
+    }
 }

+ 4 - 6
app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.java

@@ -10,11 +10,9 @@ import androidx.fragment.app.FragmentPagerAdapter;
 
 
 import com.example.zhpan.circleviewpager.fragment.BaseFragment;
-import com.example.zhpan.circleviewpager.fragment.FindFragment;
+import com.example.zhpan.circleviewpager.fragment.IndicatorFragment;
+import com.example.zhpan.circleviewpager.fragment.PageFragment;
 import com.example.zhpan.circleviewpager.fragment.HomeFragment;
-import com.example.zhpan.circleviewpager.fragment.OthersFragment;
-
-import java.util.List;
 
 public class AdapterFragmentPager extends FragmentPagerAdapter {
 
@@ -34,8 +32,8 @@ public class AdapterFragmentPager extends FragmentPagerAdapter {
     private SparseArray<BaseFragment> getFragments() {
         SparseArray<BaseFragment> fragmentList = new SparseArray<>();
         fragmentList.put(PAGE_HOME, HomeFragment.getInstance());
-        fragmentList.put(PAGE_FIND, FindFragment.getInstance());
-        fragmentList.put(PAGE_OTHERS, OthersFragment.getInstance());
+        fragmentList.put(PAGE_FIND, PageFragment.getInstance());
+        fragmentList.put(PAGE_OTHERS, IndicatorFragment.getInstance());
         return fragmentList;
     }
 

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

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

@@ -6,6 +6,8 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
@@ -35,7 +37,7 @@ public abstract class BaseFragment extends RxFragment {
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         View view = inflater.inflate(getLayout(), container, false);
-        mBind = ButterKnife.bind(this,view);
+        mBind = ButterKnife.bind(this, view);
         initData();
         initTitle();
         initView(savedInstanceState, view);
@@ -51,12 +53,17 @@ public abstract class BaseFragment extends RxFragment {
     }
 
     private void initData() {
-        for (int i = 0; i <= 3; i++) {
+        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();

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

@@ -1,10 +1,8 @@
 package com.example.zhpan.circleviewpager.fragment;
 
-import android.graphics.Color;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import androidx.recyclerview.widget.DividerItemDecoration;
@@ -22,8 +20,7 @@ import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.constants.IndicatorGravity;
-import com.zhpan.bannerview.utils.DpUtils;
-import com.zhpan.idea.net.common.DefaultObserver;
+import com.zhpan.idea.net.common.ResponseObserver;
 import com.zhpan.idea.utils.RxUtil;
 
 import java.util.ArrayList;
@@ -81,13 +78,10 @@ public class HomeFragment extends BaseFragment {
     }
 
     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());
@@ -115,8 +109,7 @@ public class HomeFragment extends BaseFragment {
                 .setInterval(3000)
                 .setCanLoop(false)
                 .setAutoPlay(true)
-                .setRoundCorner(DpUtils.dp2px(7))
-                .setIndicatorColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))
+                .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setIndicatorGravity(IndicatorGravity.END)
                 .setScrollDuration(1000).setHolderCreator(NetViewHolder::new)
                 .setOnPageClickListener(position -> {
@@ -135,13 +128,15 @@ public class HomeFragment extends BaseFragment {
 
     @Override
     public void onStop() {
-        mBannerViewPager.stopLoop();
+        if (mBannerViewPager != null)
+            mBannerViewPager.stopLoop();
         super.onStop();
     }
 
     @Override
     public void onResume() {
-        mBannerViewPager.startLoop();
+        if (mBannerViewPager != null)
+            mBannerViewPager.startLoop();
         super.onResume();
     }
 }

+ 20 - 19
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java → app/src/main/java/com/example/zhpan/circleviewpager/fragment/IndicatorFragment.java

@@ -14,7 +14,7 @@ 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.DpUtils;
+import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.idea.utils.ToastUtils;
 
 import butterknife.BindView;
@@ -23,7 +23,7 @@ import butterknife.OnClick;
 /**
  * Created by zhpan on 2018/7/24.
  */
-public class OthersFragment extends BaseFragment {
+public class IndicatorFragment extends BaseFragment {
     @BindView(R.id.banner_view)
     BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     @BindView(R.id.rg_indicator_style)
@@ -43,13 +43,13 @@ public class OthersFragment extends BaseFragment {
 
     @Override
     protected void initView(Bundle savedInstanceState, View view) {
-        mViewPager.setIndicatorGap(DpUtils.dp2px(6))
+        mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
                 .setHolderCreator(() -> new ImageResourceViewHolder(0));
         initRadioGroup();
     }
 
-    public static OthersFragment getInstance() {
-        return new OthersFragment();
+    public static IndicatorFragment getInstance() {
+        return new IndicatorFragment();
     }
 
     private void initRadioGroup() {
@@ -76,29 +76,29 @@ public class OthersFragment extends BaseFragment {
     private void setupCircleIndicator() {
         mViewPager.setIndicatorStyle(IndicatorStyle.CIRCLE)
                 .setIndicatorGravity(IndicatorGravity.CENTER)
-                .setIndicatorGap(DpUtils.dp2px(6))
+                .setIndicatorGap(BannerUtils.dp2px(6))
                 .setPageMargin(0)
-                .setIndicatorMargin(0, 0, 0, DpUtils.dp2px(10))
+                .setIndicatorMargin(0, 0, 0, BannerUtils.dp2px(10))
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
-                .setIndicatorColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))
-                .setIndicatorRadius(DpUtils.dp2px(4), DpUtils.dp2px(5)).create(mDrawableList);
+                .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(DpUtils.dp2px(3f))
+                .setIndicatorHeight(BannerUtils.dp2px(3f))
                 .setIndicatorGravity(IndicatorGravity.CENTER)
-                .setIndicatorGap(DpUtils.dp2px(3))
+                .setIndicatorGap(BannerUtils.dp2px(3))
                 .setPageMargin(0)
-                .setIndicatorWidth(DpUtils.dp2px(3), DpUtils.dp2px(10))
+                .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(DpUtils.dp2px(20))
-                .setIndicatorMargin(0, 0, DpUtils.dp2px(10), DpUtils.dp2px(10))
+                .setPageMargin(BannerUtils.dp2px(20))
+                .setIndicatorMargin(0, 0, BannerUtils.dp2px(10), BannerUtils.dp2px(10))
                 .setIndicatorGravity(IndicatorGravity.END)
                 .setIndicatorView(setupIndicatorView())
                 .setHolderCreator(() -> new ImageResourceViewHolder(0)).create(mDrawableList);
@@ -109,8 +109,8 @@ public class OthersFragment extends BaseFragment {
      */
     private FigureIndicatorView setupIndicatorView() {
         FigureIndicatorView indicatorView = new FigureIndicatorView(mContext);
-        indicatorView.setRadius(DpUtils.dp2px(18));
-        indicatorView.setTextSize(DpUtils.dp2px(13));
+        indicatorView.setRadius(BannerUtils.dp2px(18));
+        indicatorView.setTextSize(BannerUtils.dp2px(13));
         indicatorView.setBackgroundColor(Color.parseColor("#aa118EEA"));
         return indicatorView;
     }
@@ -121,8 +121,9 @@ public class OthersFragment extends BaseFragment {
     }
 
     @Override
-    public void onDestroy() {
-        mViewPager.stopLoop();
-        super.onDestroy();
+    public void onDestroyView() {
+        if (mViewPager != null)
+            mViewPager.stopLoop();
+        super.onDestroyView();
     }
 }

+ 19 - 23
app/src/main/java/com/example/zhpan/circleviewpager/fragment/FindFragment.java → app/src/main/java/com/example/zhpan/circleviewpager/fragment/PageFragment.java

@@ -12,16 +12,12 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.example.zhpan.circleviewpager.R;
-import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.annotation.APageStyle;
-import com.zhpan.bannerview.constants.IndicatorGravity;
-import com.zhpan.bannerview.constants.IndicatorStyle;
 import com.zhpan.bannerview.constants.PageStyle;
-import com.zhpan.bannerview.indicator.BaseIndicatorView;
 import com.zhpan.bannerview.indicator.CircleIndicatorView;
-import com.zhpan.bannerview.utils.DpUtils;
+import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.idea.utils.ToastUtils;
 
 import butterknife.BindView;
@@ -29,7 +25,8 @@ import butterknife.BindView;
 /**
  * Created by zhpan on 2018/7/24.
  */
-public class FindFragment extends BaseFragment {
+public class PageFragment extends BaseFragment {
+
     @BindView(R.id.banner_view)
     BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     @BindView(R.id.rg_page_style)
@@ -52,12 +49,12 @@ public class FindFragment extends BaseFragment {
     @Override
     protected void initView(Bundle savedInstanceState, View view) {
         mViewPager
-                .setPageMargin(DpUtils.dp2px(10))
-                .setRevealWidth(DpUtils.dp2px(10))
-                .setHolderCreator(() -> new ImageResourceViewHolder(DpUtils.dp2px(5)))
-                .setIndicatorColor(Color.parseColor("#935656"), Color.parseColor("#FF4C39"))
+                .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(3000);
+                .setInterval(5000);
         initRadioGroup();
     }
 
@@ -67,8 +64,8 @@ public class FindFragment extends BaseFragment {
         return super.onCreateView(inflater, container, savedInstanceState);
     }
 
-    public static FindFragment getInstance() {
-        return new FindFragment();
+    public static PageFragment getInstance() {
+        return new PageFragment();
     }
 
     private void setupBanner(@APageStyle int pageStyle) {
@@ -96,27 +93,26 @@ public class FindFragment extends BaseFragment {
 
     private void setupOverlapBanner() {
         mViewPager
-                .setIndicatorVisibility(View.GONE)
+                .setIndicatorVisibility(View.GONE) // 在实际开发中这行代码不必添加,此处因为受到其它两种模式影响所以要隐藏掉内置指示器
                 .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
-                .setIndicatorView(setupIndicatorView())
+                .setIndicatorView(indicatorView)
+                .setIndicatorColor(Color.parseColor("#888888"),
+                        Color.parseColor("#118EEA"))
                 .create(mDrawableList);
     }
 
-    private BaseIndicatorView setupIndicatorView() {
-        indicatorView.setCheckedColor(Color.parseColor("#935656"));
-        indicatorView.setNormalColor(Color.parseColor("#FF4C39"));
-        return indicatorView;
-    }
-
     @Override
     public void onStop() {
+        if (mViewPager != null)
+            mViewPager.stopLoop();
         super.onStop();
-        mViewPager.stopLoop();
     }
 
     @Override
     public void onResume() {
+
+        if (mViewPager != null)
+            mViewPager.startLoop();
         super.onResume();
-        mViewPager.startLoop();
     }
 }

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

@@ -7,7 +7,6 @@ import android.util.AttributeSet;
 import androidx.appcompat.widget.AppCompatImageView;
 
 import com.zhpan.bannerview.provider.ViewStyleSetter;
-import com.zhpan.bannerview.utils.DpUtils;
 
 public class CornerImageView extends AppCompatImageView {
     public CornerImageView(Context context) {

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

@@ -10,7 +10,7 @@ import androidx.annotation.ColorInt;
 import androidx.annotation.Nullable;
 
 import com.zhpan.bannerview.indicator.BaseIndicatorView;
-import com.zhpan.bannerview.utils.DpUtils;
+import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
  * <pre>
@@ -20,13 +20,13 @@ import com.zhpan.bannerview.utils.DpUtils;
  */
 public class FigureIndicatorView extends BaseIndicatorView {
 
-    private int radius = DpUtils.dp2px(20);
+    private int radius = BannerUtils.dp2px(20);
 
     private int backgroundColor = Color.parseColor("#88FF5252");
 
     private int textColor = Color.WHITE;
 
-    private int textSize=DpUtils.dp2px(13);
+    private int textSize= BannerUtils.dp2px(13);
 
     public FigureIndicatorView(Context context) {
         this(context, null);

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

@@ -17,7 +17,7 @@ import com.zhpan.bannerview.holder.ViewHolder;
 public class CustomPageViewHolder implements ViewHolder<CustomBean> {
     private ImageView mImageView;
     private TextView mTextView;
-    private TextView mTvStart;
+    private ImageView mImageStart;
     private OnSubViewClickListener mOnSubViewClickListener;
 
     @Override
@@ -25,7 +25,7 @@ public class CustomPageViewHolder implements ViewHolder<CustomBean> {
         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);
-        mTvStart = view.findViewById(R.id.btn_start);
+        mImageStart = view.findViewById(R.id.iv_logo);
         return view;
     }
 
@@ -33,11 +33,11 @@ public class CustomPageViewHolder implements ViewHolder<CustomBean> {
     public void onBind(Context context, CustomBean data, int position, int size) {
         mImageView.setImageResource(data.getImageRes());
         mTextView.setText(data.getImageDescription());
-        mTvStart.setOnClickListener(view -> {
+        mImageStart.setOnClickListener(view -> {
             if (null != mOnSubViewClickListener)
                 mOnSubViewClickListener.onViewClick(view, position);
         });
-        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mTvStart, "alpha", 0, 1);
+        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageStart, "alpha", 0, 1);
         alphaAnimator.setDuration(1500);
 
         ObjectAnimator translationAnim = ObjectAnimator.ofFloat(mTextView, "translationX", -120, 0);

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


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

@@ -61,7 +61,7 @@
 
 
 
-        <androidx.viewpager.widget.ViewPager
+        <com.zhpan.bannerview.view.CatchViewPager
             android:id="@+id/vp_fragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent"

+ 14 - 0
app/src/main/res/layout/activity_welcome.xml

@@ -16,4 +16,18 @@
         android:layout_alignParentBottom="true"
         android:layout_centerHorizontal="true"
         android:layout_marginBottom="100dp" />
+
+    <TextView
+        android:id="@+id/btn_start"
+        android:layout_width="wrap_content"
+        android:layout_height="35dp"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="20dp"
+        android:background="@drawable/bg_start"
+        android:gravity="center_vertical"
+        android:text="@string/start_now"
+        android:textColor="#FFFFFF"
+        android:textSize="16sp"
+        android:visibility="gone" />
 </RelativeLayout>

+ 2 - 15
app/src/main/res/layout/item_custom_view.xml

@@ -3,7 +3,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-
     <ImageView
         android:id="@+id/banner_image"
         android:layout_width="match_parent"
@@ -12,25 +11,13 @@
         android:scaleType="fitXY" />
 
     <ImageView
+        android:id="@+id/iv_logo"
         android:layout_width="60dp"
         android:layout_height="60dp"
-        android:layout_marginStart="40dp"
+        android:layout_centerHorizontal="true"
         android:layout_marginTop="40dp"
         android:src="@mipmap/ic_launcher" />
 
-    <TextView
-        android:id="@+id/btn_start"
-        android:layout_width="wrap_content"
-        android:layout_height="35dp"
-        android:layout_alignParentBottom="true"
-        android:layout_centerHorizontal="true"
-        android:layout_marginBottom="20dp"
-        android:background="@drawable/bg_start"
-        android:gravity="center_vertical"
-        android:text="@string/start_now"
-        android:textColor="#FFFFFF"
-        android:textSize="16sp" />
-
     <TextView
         android:id="@+id/tv_describe"
         android:layout_width="wrap_content"

+ 1 - 2
app/src/main/res/layout/item_header_view.xml

@@ -6,7 +6,6 @@
     <com.zhpan.bannerview.BannerViewPager
         android:id="@+id/banner_view"
         android:layout_width="match_parent"
-        android:layout_margin="10dp"
-        android:layout_height="180dp" />
+        android:layout_height="200dp" />
 
 </LinearLayout>

+ 3 - 0
app/src/main/res/values/colors.xml

@@ -14,4 +14,7 @@
     <color name="tab_normal_text">#000000</color>
     <color name="tab_selected_text">#000000</color>
     <color name="line_color">#DCDCDC</color>
+
+    <color name="red_checked_color">#FF4C39</color>
+    <color name="red_normal_color">#935656</color>
 </resources>

+ 6 - 14
app/src/main/res/values/strings.xml

@@ -1,22 +1,14 @@
 <resources>
     <string name="app_name">BannerViewPager</string>
-    <string name="wrapper_photo_view">嵌套PhotoView</string>
-    <string name="title_custom_page">自定义页面布局</string>
-    <string name="title_view_pager">圆角自动轮播</string>
-    <string name="load_data">嵌套RecyclerView</string>
-    <string name="title_transformer">Page Transformer</string>
-    <string name="start_now">立即体验</string>
+    <string name="wrapper_photo_view">With PhotoView</string>
+    <string name="start_now">Start Now</string>
     <string name="guide">guide</string>
-    <string name="indicator_style">Indicator Style</string>
-    <string name="image_description">image description</string>
     <string name="normal">NORMAL</string>
     <string name="smooth">SMOOTH</string>
-    <string name="custom_indicator_view">自定义IndicatorView</string>
-    <string name="page_style">一屏多页</string>
-
-    <string name="tab1">首页</string>
-    <string name="tab2">发现</string>
-    <string name="tab3">其它</string>
+    <string name="image_description">image description</string>
+    <string name="tab1">Home</string>
+    <string name="tab2">Page</string>
+    <string name="tab3">Indicator</string>
     <string name="text_page_style">Page Style:</string>
     <string name="text_indicator_style">Indicator Style:</string>
 </resources>

+ 107 - 125
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -26,17 +26,17 @@ import com.zhpan.bannerview.annotation.Visibility;
 import com.zhpan.bannerview.constants.IndicatorSlideMode;
 import com.zhpan.bannerview.constants.IndicatorStyle;
 import com.zhpan.bannerview.constants.PageStyle;
-import com.zhpan.bannerview.indicator.BaseIndicatorView;
 import com.zhpan.bannerview.indicator.DashIndicatorView;
 import com.zhpan.bannerview.indicator.IIndicator;
 import com.zhpan.bannerview.indicator.IndicatorFactory;
 import com.zhpan.bannerview.transform.pagestyle.ScaleInTransformer;
-import com.zhpan.bannerview.utils.DpUtils;
+import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.bannerview.adapter.BannerPagerAdapter;
 import com.zhpan.bannerview.holder.HolderCreator;
 import com.zhpan.bannerview.holder.ViewHolder;
 import com.zhpan.bannerview.provider.ViewStyleSetter;
 import com.zhpan.bannerview.transform.PageTransformerFactory;
+import com.zhpan.bannerview.utils.PositionUtils;
 import com.zhpan.bannerview.view.CatchViewPager;
 
 import java.util.ArrayList;
@@ -78,7 +78,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private IIndicator mIndicatorView;
 
-    private RelativeLayout mRelativeLayout;
+    private RelativeLayout mIndicatorLayout;
 
     private int mPageMargin;
 
@@ -124,6 +124,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     private int mIndicatorVisibility;
     private int mScrollDuration;
     private int mRoundCorner;
+    private boolean disableTouchScroll;
 
     public BannerViewPager(Context context) {
         this(context, null);
@@ -139,18 +140,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void init(AttributeSet attrs) {
-        initValues(attrs);
+        initAttrs(attrs);
         initView();
     }
 
     private void initView() {
         inflate(getContext(), R.layout.layout_banner_view_pager, this);
         mViewPager = findViewById(R.id.vp_main);
-        mRelativeLayout = findViewById(R.id.rl_indicator);
+        mIndicatorLayout = findViewById(R.id.rl_indicator);
         mList = new ArrayList<>();
     }
 
-    private void initValues(AttributeSet attrs) {
+    private void initAttrs(AttributeSet attrs) {
         if (attrs != null) {
             TypedArray typedArray =
                     getContext().obtainStyledAttributes(attrs, R.styleable.BannerViewPager);
@@ -163,18 +164,12 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
                     typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_normal_color,
                             Color.parseColor("#8C6C6D72"));
             normalIndicatorWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_indicator_radius,
-                    DpUtils.dp2px(8));
-
-            indicatorGap = normalIndicatorWidth;
-            indicatorHeight = normalIndicatorWidth / 2;
-            checkedIndicatorWidth = normalIndicatorWidth;
-
+                    BannerUtils.dp2px(8));
             isAutoPlay = typedArray.getBoolean(R.styleable.BannerViewPager_bvp_auto_play, true);
             isCanLoop = typedArray.getBoolean(R.styleable.BannerViewPager_bvp_can_loop, true);
             mPageMargin = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_page_margin, 0);
             mRoundCorner = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_round_corner, 0);
             mRevealWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_reveal_width, 0);
-
             indicatorGravity = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_gravity, 0);
             mPageStyle = typedArray.getInt(R.styleable.BannerViewPager_bvp_page_style, 0);
             mIndicatorStyle = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_style, 0);
@@ -182,38 +177,47 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
             mIndicatorVisibility = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_visibility, 0);
             mScrollDuration = typedArray.getInt(R.styleable.BannerViewPager_bvp_scroll_duration, 800);
             typedArray.recycle();
+            indicatorGap = normalIndicatorWidth;
+            indicatorHeight = normalIndicatorWidth / 2;
+            checkedIndicatorWidth = normalIndicatorWidth;
         }
     }
 
-    private void initData() {
-        if (mList.size() > 0) {
-            if (mList.size() > 1) {
-                if (isCustomIndicator && null != mIndicatorView) {
-                    initIndicator(mIndicatorView);
-                } else {
-                    initIndicator(getIndicatorView());
+    private void initBannerData(List<T> list) {
+        if (list != null) {
+            mList.clear();
+            mList.addAll(list);
+            if (mList.size() > 0) {
+                if (mList.size() > 1) {
+                    if (isCustomIndicator && null != mIndicatorView) {
+                        initIndicator(mIndicatorView);
+                    } else {
+                        initIndicator(IndicatorFactory.createIndicatorView(getContext(), mIndicatorStyle));
+                    }
                 }
+                if (isCanLoop) {
+                    currentPosition = mPageStyle == PageStyle.NORMAL ? 1 : 2;
+                }
+                setupViewPager();
+                setIndicatorValues();
             }
-            if (isCanLoop) {
-                currentPosition = mPageStyle == PageStyle.NORMAL ? 1 : 2;
-            }
-            setupViewPager();
         }
     }
 
-    private BaseIndicatorView getIndicatorView() {
-        BaseIndicatorView indicatorView = IndicatorFactory.createIndicatorView(getContext(), mIndicatorStyle);
-        indicatorView.setPageSize(mList.size());
-        indicatorView.setIndicatorWidth(normalIndicatorWidth, checkedIndicatorWidth);
-        indicatorView.setIndicatorGap(indicatorGap);
-        indicatorView.setCheckedColor(indicatorCheckedColor);
-        indicatorView.setNormalColor(indicatorNormalColor);
-        indicatorView.setSlideMode(mIndicatorSlideMode);
-        if (indicatorView instanceof DashIndicatorView) {
-            ((DashIndicatorView) indicatorView).setSliderHeight(indicatorHeight);
+
+    private void setIndicatorValues() {
+        if (null != mIndicatorView) {
+            mIndicatorView.setPageSize(mList.size());
+            mIndicatorView.setCheckedColor(indicatorCheckedColor);
+            mIndicatorView.setNormalColor(indicatorNormalColor);
+            mIndicatorView.setIndicatorGap(indicatorGap);
+            mIndicatorView.setSlideMode(mIndicatorSlideMode);
+            mIndicatorView.setIndicatorWidth(normalIndicatorWidth, checkedIndicatorWidth);
+            if (mIndicatorView instanceof DashIndicatorView) {
+                ((DashIndicatorView) mIndicatorView).setSliderHeight(indicatorHeight);
+            }
+            mIndicatorView.notifyDataChanged();
         }
-        indicatorView.invalidate();
-        return indicatorView;
     }
 
     /**
@@ -241,35 +245,40 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void initIndicator(IIndicator indicatorView) {
-        mRelativeLayout.setVisibility(mIndicatorVisibility);
+        mIndicatorLayout.setVisibility(mIndicatorVisibility);
         mIndicatorView = indicatorView;
-        if (((View) indicatorView).getParent() == null) {
-            mRelativeLayout.removeAllViews();
-            mRelativeLayout.addView((View) indicatorView);
-            setIndicatorViewMargin();
-            RelativeLayout.LayoutParams layoutParams =
-                    (RelativeLayout.LayoutParams) ((View) indicatorView).getLayoutParams();
-            switch (indicatorGravity) {
-                case CENTER:
-                    layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
-                    break;
-                case START:
-                    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
-                    break;
-                case END:
-                    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
-                    break;
-            }
+        if (((View) mIndicatorView).getParent() == null) {
+            mIndicatorLayout.removeAllViews();
+            mIndicatorLayout.addView((View) mIndicatorView);
+            initIndicatorViewMargin();
+            initIndicatorGravity();
         }
     }
 
-    private void setIndicatorViewMargin() {
-        if (mIndicatorMargin != null) {
-            ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) mRelativeLayout.getLayoutParams();
-            layoutParams.rightMargin = mIndicatorMargin.right;
-            layoutParams.bottomMargin = mIndicatorMargin.bottom;
-            layoutParams.topMargin = mIndicatorMargin.top;
-            layoutParams.leftMargin = mIndicatorMargin.left;
+    private void initIndicatorGravity() {
+        RelativeLayout.LayoutParams layoutParams =
+                (RelativeLayout.LayoutParams) ((View) mIndicatorView).getLayoutParams();
+        switch (indicatorGravity) {
+            case CENTER:
+                layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
+                break;
+            case START:
+                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
+                break;
+            case END:
+                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
+                break;
+        }
+    }
+
+    private void initIndicatorViewMargin() {
+        ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) mIndicatorView).getLayoutParams();
+        if (mIndicatorMargin == null) {
+            int dp10 = BannerUtils.dp2px(10);
+            layoutParams.setMargins(dp10, dp10, dp10, dp10);
+        } else {
+            layoutParams.setMargins(mIndicatorMargin.left, mIndicatorMargin.top,
+                    mIndicatorMargin.right, mIndicatorMargin.bottom);
         }
     }
 
@@ -280,7 +289,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
             bannerPagerAdapter.setPageStyle(mPageStyle);
             bannerPagerAdapter.setPageClickListener(position -> {
                 if (mOnPageClickListener != null) {
-                    mOnPageClickListener.onPageClick(getRealPosition(position));
+                    mOnPageClickListener.onPageClick(PositionUtils.getRealPosition(isCanLoop, position, mList.size(), mPageStyle));
                 }
             });
             bannerPagerAdapter.setCanLoop(isCanLoop);
@@ -288,6 +297,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
             mViewPager.setCurrentItem(currentPosition);
             mViewPager.addOnPageChangeListener(this);
             mViewPager.setScrollDuration(mScrollDuration);
+            mViewPager.disableTouchScroll(disableTouchScroll);
             initPageStyle();
             startLoop();
             setTouchListener();
@@ -316,8 +326,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     }
 
     private void setMultiPageStyle(boolean overlap, float scale) {
-        mPageMargin = mPageMargin == 0 ? DpUtils.dp2px(20) : mPageMargin;
-        mRevealWidth = mRevealWidth == 0 ? DpUtils.dp2px(20) : mRevealWidth;
+        mPageMargin = mPageMargin == 0 ? BannerUtils.dp2px(20) : mPageMargin;
+        mRevealWidth = mRevealWidth == 0 ? BannerUtils.dp2px(20) : mRevealWidth;
         setClipChildren(false);
         ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mViewPager.getLayoutParams();
         params.leftMargin = mPageMargin + mRevealWidth;
@@ -330,10 +340,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     public void onPageSelected(int position) {
-        currentPosition = position;
+        if (mOnPageChangeListener != null)
+            mOnPageChangeListener.onPageSelected(PositionUtils.getRealPosition(isCanLoop, position, mList.size(), mPageStyle));
+
         if (mIndicatorView != null) {
-            mIndicatorView.onPageSelected(getRealPosition(position));
+            mIndicatorView.onPageSelected(PositionUtils.getRealPosition(isCanLoop, position, mList.size(), mPageStyle));
         }
+
+        currentPosition = position;
+
     }
 
     @Override
@@ -341,6 +356,9 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         if (mIndicatorView != null) {
             mIndicatorView.onPageScrollStateChanged(state);
         }
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrollStateChanged(state);
+        }
         if (isCanLoop) {
             switch (state) {
                 case ViewPager.SCROLL_STATE_IDLE:
@@ -358,60 +376,19 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
                     }
                     break;
             }
-        } else {
-            mViewPager.setCurrentItem(currentPosition);
         }
     }
 
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageScrolled(getRealPosition(position), positionOffset, positionOffsetPixels);
-        }
-    }
-
-    private int getRealPosition(int position) {
-        if (isCanLoop) {
-            if (mPageStyle == PageStyle.NORMAL) {
-                if (position == 0) {
-                    return mList.size() - 1;
-                } else if (position == mList.size() + 1) {
-                    return 0;
-                } else {
-                    return --position;
-                }
-            } else {
-                if (position == 0) {
-                    return mList.size() == 1 ? 0 : mList.size() - 2;
-                } else if (position == 1) {
-                    return mList.size() - 1;
-                } else if (position == mList.size() + 3) {
-                    return 1;
-                } else if (position == mList.size() + 2) {
-                    return 0;
-                } else {
-                    return position - 2;
-                }
-            }
-
-        } else {
-            return position;
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
         }
+        if (mIndicatorView != null)
+            mIndicatorView.onPageScrolled(PositionUtils.getRealPosition(isCanLoop, position, mList.size(), mPageStyle),
+                    positionOffset, positionOffsetPixels);
     }
 
-    private int toUnrealPosition(int position) {
-        if (isCanLoop) {
-            if (mPageStyle == PageStyle.NORMAL) {
-                return (position < mList.size()) ? (++position) : mList.size();
-            } else {
-                return (position < mList.size()) ? position + 2 : mList.size() + 1;
-            }
-        } else {
-            return position;
-        }
-    }
-
-
     /**
      * @return BannerViewPager数据集合
      */
@@ -615,7 +592,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      */
     @Deprecated
     public BannerViewPager<T, VH> showIndicator(boolean showIndicator) {
-        mRelativeLayout.setVisibility(showIndicator ? VISIBLE : GONE);
+        mIndicatorLayout.setVisibility(showIndicator ? VISIBLE : GONE);
         return this;
     }
 
@@ -682,22 +659,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param list ViewPager数据
      */
     public void create(List<T> list) {
-        if (list != null) {
-            mList.clear();
-            mList.addAll(list);
-            initData();
-            if (null != mIndicatorView) {
-                mIndicatorView.setPageSize(mList.size());
-                mIndicatorView.notifyDataChanged();
-            }
-        }
+        initBannerData(list);
     }
 
     /**
      * @return the currently selected page position.
      */
     public int getCurrentItem() {
-        return getRealPosition(currentPosition);
+        return PositionUtils.getRealPosition(isCanLoop, currentPosition, mList.size(), mPageStyle);
     }
 
     /**
@@ -708,7 +677,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param item Item index to select
      */
     public void setCurrentItem(int item) {
-        mViewPager.setCurrentItem(toUnrealPosition(item));
+        mViewPager.setCurrentItem(PositionUtils.toUnrealPosition(isCanLoop, item, mList.size(), mPageStyle));
     }
 
     /**
@@ -718,7 +687,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
      */
     public void setCurrentItem(int item, boolean smoothScroll) {
-        mViewPager.setCurrentItem(toUnrealPosition(item), smoothScroll);
+        mViewPager.setCurrentItem(PositionUtils.toUnrealPosition(isCanLoop, item, mList.size(), mPageStyle), smoothScroll);
     }
 
     /**
@@ -776,6 +745,12 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         return this;
     }
 
+    public BannerViewPager<T, VH> disableTouchScroll(boolean disableTouchScroll) {
+        this.disableTouchScroll = disableTouchScroll;
+        return this;
+    }
+
+
     /**
      * 仅供demo使用
      */
@@ -795,4 +770,11 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     private static class IndicatorMargin {
         private int left, right, top, bottom;
     }
+
+    private ViewPager.OnPageChangeListener mOnPageChangeListener;
+
+    public BannerViewPager<T, VH> setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
+        mOnPageChangeListener = onPageChangeListener;
+        return this;
+    }
 }

+ 13 - 46
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -10,6 +10,8 @@ import com.zhpan.bannerview.annotation.APageStyle;
 import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.holder.HolderCreator;
 import com.zhpan.bannerview.holder.ViewHolder;
+import com.zhpan.bannerview.utils.BannerUtils;
+import com.zhpan.bannerview.utils.PositionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -20,7 +22,7 @@ import java.util.List;
 
 public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
 
-    private List<T> list;
+    private List<T> mList;
 
     private HolderCreator holderCreator;
 
@@ -33,21 +35,20 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     private int mPageStyle;
 
     public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
-        this.list = list;
+        this.mList = list;
         this.holderCreator = holderCreator;
     }
 
-
     @Override
     public int getCount() {
-        if (isCanLoop && list.size() > 1) {
+        if (isCanLoop && mList.size() > 1) {
             if (mPageStyle == PageStyle.NORMAL) {
-                return list.size() + 2;
+                return mList.size() + 2;
             } else {
-                return list.size() + 4;
+                return mList.size() + 4;
             }
         } else {
-            return list.size();
+            return mList.size();
         }
     }
 
@@ -59,7 +60,7 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     @Override
     public @NonNull
     Object instantiateItem(@NonNull final ViewGroup container, final int position) {
-        View itemView = findViewByPosition(container, position);
+        View itemView = findViewByPosition(container, PositionUtils.getRealPosition(isCanLoop, position, mList.size(), mPageStyle));
         container.addView(itemView);
         return itemView;
     }
@@ -87,43 +88,9 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
 
     private View createView(ViewHolder<T> holder, int position, ViewGroup container) {
         View view = null;
-        if (list != null && list.size() > 0) {
-            if (isCanLoop && list.size() > 1) {
-                int size = list.size();
-                if (mPageStyle == PageStyle.NORMAL) {
-                    if (position == 0) {
-                        view = holder.createView(container, container.getContext(), list.size() - 1);
-                        holder.onBind(container.getContext(), list.get(list.size() - 1), list.size() - 1, size);
-                    } else if (position == list.size() + 1) {
-                        view = holder.createView(container, container.getContext(), 0);
-                        holder.onBind(container.getContext(), list.get(0), 0, size);
-                    } else {
-                        view = holder.createView(container, container.getContext(), position - 1);
-                        holder.onBind(container.getContext(), list.get(position - 1), position - 1, size);
-                    }
-                } else {
-                    if (position == 0) {
-                        view = holder.createView(container, container.getContext(), list.size() - 2);
-                        holder.onBind(container.getContext(), list.get(list.size() - 2), list.size() - 2, size);
-                    } else if (position == 1) {
-                        view = holder.createView(container, container.getContext(), list.size() - 1);
-                        holder.onBind(container.getContext(), list.get(list.size() - 1), list.size() - 1, size);
-                    } else if (position == size + 2) {
-                        view = holder.createView(container, container.getContext(), 0);
-                        holder.onBind(container.getContext(), list.get(0), 0, size);
-                    } else if (position == size + 3) {
-                        view = holder.createView(container, container.getContext(), 1);
-                        holder.onBind(container.getContext(), list.get(1), 1, size);
-                    } else {
-                        view = holder.createView(container, container.getContext(), position - 2);
-                        holder.onBind(container.getContext(), list.get(position - 2), position - 2, size);
-                    }
-                }
-
-            } else {
-                view = holder.createView(container, container.getContext(), position);
-                holder.onBind(container.getContext(), list.get(position), position, list.size());
-            }
+        if (mList != null && mList.size() > 0) {
+            view = holder.createView(container, container.getContext(), position);
+            holder.onBind(container.getContext(), mList.get(position), position, mList.size());
             setViewListener(view, position);
         }
         return view;
@@ -133,7 +100,7 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
         if (view != null)
             view.setOnClickListener(v -> {
                 if (null != mPageClickListener)
-                    mPageClickListener.onPageClick(position);
+                    mPageClickListener.onPageClick(PositionUtils.toUnrealPosition(isCanLoop, position, mList.size(), mPageStyle));
             });
     }
 

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

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

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

@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
 
 import com.zhpan.bannerview.annotation.AIndicatorSlideMode;
 import com.zhpan.bannerview.constants.IndicatorSlideMode;
-import com.zhpan.bannerview.utils.DpUtils;
+import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
  * <pre>
@@ -75,7 +75,7 @@ public class BaseIndicatorView extends View implements IIndicator {
 
     public BaseIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
-        normalIndicatorWidth = DpUtils.dp2px(8);
+        normalIndicatorWidth = BannerUtils.dp2px(8);
         checkedIndicatorWidth = normalIndicatorWidth;
         indicatorGap = normalIndicatorWidth;
         normalColor = Color.parseColor("#8C18171C");

+ 50 - 0
bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java

@@ -0,0 +1,50 @@
+package com.zhpan.bannerview.utils;
+
+import android.content.res.Resources;
+import android.util.Log;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2019-08-14.
+ *   Description:
+ * </pre>
+ */
+public class BannerUtils {
+
+    private static final boolean DEBUG = true;
+
+    public float density;
+
+    public BannerUtils() {
+        this.density = Resources.getSystem().getDisplayMetrics().density;
+    }
+
+    public static int dp2px(float dpValue) {
+        return (int) (0.5F + dpValue * Resources.getSystem().getDisplayMetrics().density);
+    }
+
+    public static float px2dp(float pxValue) {
+        return pxValue / Resources.getSystem().getDisplayMetrics().density;
+    }
+
+    public int dip2px(float dpValue) {
+        return (int) (0.5F + dpValue * this.density);
+    }
+
+    public float px2dip(int pxValue) {
+        return (float) pxValue / this.density;
+    }
+
+
+    public static void e(String tag, String msg) {
+        if (DEBUG) {
+            Log.e(tag, msg);
+        }
+    }
+
+    public static void e(String msg) {
+        if (DEBUG) {
+            Log.e("BannerView", msg);
+        }
+    }
+}

+ 0 - 36
bannerview/src/main/java/com/zhpan/bannerview/utils/DpUtils.java

@@ -1,36 +0,0 @@
-package com.zhpan.bannerview.utils;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.util.DisplayMetrics;
-
-/**
- * <pre>
- *   Created by zhangpan on 2019-08-14.
- *   Description:
- * </pre>
- */
-public class DpUtils {
-
-    public float density;
-
-    public DpUtils() {
-        this.density = Resources.getSystem().getDisplayMetrics().density;
-    }
-
-    public static int dp2px(float dpValue) {
-        return (int)(0.5F + dpValue * Resources.getSystem().getDisplayMetrics().density);
-    }
-
-    public static float px2dp(float pxValue) {
-        return pxValue / Resources.getSystem().getDisplayMetrics().density;
-    }
-
-    public int dip2px(float dpValue) {
-        return (int)(0.5F + dpValue * this.density);
-    }
-
-    public float px2dip(int pxValue) {
-        return (float)pxValue / this.density;
-    }
-}

+ 48 - 0
bannerview/src/main/java/com/zhpan/bannerview/utils/PositionUtils.java

@@ -0,0 +1,48 @@
+package com.zhpan.bannerview.utils;
+
+import com.zhpan.bannerview.constants.PageStyle;
+
+public class PositionUtils {
+
+    public static int toUnrealPosition(boolean isCanLoop, int position, int pageSize, int pageStyle) {
+        if (isCanLoop) {
+            if (pageStyle == PageStyle.NORMAL) {
+                return (position < pageSize) ? (++position) : pageSize;
+            } else {
+                return (position < pageSize) ? position + 2 : pageSize + 1;
+            }
+        } else {
+            return position;
+        }
+    }
+
+    public static int getRealPosition(boolean isCanLoop, int position, int pageSize, int pageStyle) {
+        if (isCanLoop) {
+            if (pageStyle == PageStyle.NORMAL) {
+                if (position == 0) {
+                    return pageSize - 1;
+                } else if (position == pageSize + 1) {
+                    return 0;
+                } else {
+                    return --position;
+                }
+            } else {
+                if (position == 0) {
+                    return pageSize == 1 ? 0 : pageSize - 2;
+                } else if (position == 1) {
+                    return pageSize - 1;
+                } else if (position == pageSize + 3) {
+                    return 1;
+                } else if (position == pageSize + 2) {
+                    return 0;
+                } else {
+                    return position - 2;
+                }
+            }
+
+        } else {
+            return position;
+        }
+    }
+
+}

+ 16 - 1
bannerview/src/main/java/com/zhpan/bannerview/view/CatchViewPager.java

@@ -26,7 +26,7 @@ public class CatchViewPager extends ViewPager {
     private boolean mOverlapStyle = false;
     private BannerScroller mBannerScroller;
     public static final int DEFAULT_SCROLL_DURATION = 800;
-
+    private boolean disableTouchScroll;
 
     public CatchViewPager(Context context) {
         this(context, null);
@@ -40,6 +40,9 @@ public class CatchViewPager extends ViewPager {
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         try {
+            if (disableTouchScroll) {
+                return false;
+            }
             return super.onInterceptTouchEvent(ev);
         } catch (IllegalArgumentException ex) {
             ex.printStackTrace();
@@ -92,4 +95,16 @@ public class CatchViewPager extends ViewPager {
     public void setScrollDuration(int scrollDuration) {
         mBannerScroller.setDuration(scrollDuration);
     }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (disableTouchScroll) {
+            return false;
+        }
+        return super.onTouchEvent(ev);
+    }
+
+    public void disableTouchScroll(boolean disableTouchScroll) {
+        this.disableTouchScroll = disableTouchScroll;
+    }
 }

+ 1 - 2
bannerview/src/main/res/layout/layout_banner_view_pager.xml

@@ -15,6 +15,5 @@
         android:id="@+id/rl_indicator"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_margin="10dp"/>
+        android:layout_alignParentBottom="true"/>
 </merge>

BIN
download/app.apk


+ 1 - 1
ideahttp/src/main/java/com/zhpan/idea/net/common/DefaultObserver.java → ideahttp/src/main/java/com/zhpan/idea/net/common/ResponseObserver.java

@@ -25,7 +25,7 @@ import io.reactivex.disposables.Disposable;
  * Created by zhpan on 2017/4/18.
  */
 
-public abstract class DefaultObserver<T> implements Observer<T> {
+public abstract class ResponseObserver<T> implements Observer<T> {
     @Override
     public void onSubscribe(Disposable d) {