Jelajahi Sumber

优化代码

zhpanvip 5 tahun lalu
induk
melakukan
7a47e364ea

+ 5 - 3
README.md

@@ -228,7 +228,9 @@ public class NetViewHolder implements ViewHolder<BannerData> {
 ```
 ### 6.开启与停止轮播
 
-如果开启了自动轮播功能,请务必在onDestroy中停止轮播,以免出现内存泄漏。
+***2.5.0之后版本无需自行在Activity或Fragment中管理stopLoop和startLoop方法,但这两个方法依旧保留对外开发***
+
+~~如果开启了自动轮播功能,请务必在onDestroy中停止轮播,以免出现内存泄漏。~~
 
 ```
 	@Override
@@ -238,7 +240,7 @@ public class NetViewHolder implements ViewHolder<BannerData> {
     		mViewpager.stopLoop();
     }
 ```
-为了节省性能也可以在onStop中停止轮播,在onResume中开启轮播:
+~~为了节省性能也可以在onStop中停止轮播,在onResume中开启轮播:~~
 
 ```
     @Override
@@ -353,7 +355,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
  - [x] 增添更多Indicator样式(2.3.+)
  - [x] 支持一屏显示多页 (2.4.0)
  - [x] v2.4.3版本着重优化提升性能
- - [ ] v2.4.4优化整理Indicator,尽量修复Indicator SMOOTH模式下滑动问题
+ - [ ] v2.5.0优化整理Indicator,尽量修复Indicator SMOOTH模式下滑动问题
  - [ ] ViewPager更换为ViewPager2 (3.0.0)
  - [ ] 目前Indicator部分代码比较乱,还有很大很大的优化空间,后续版本将持续优化
  

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

@@ -53,12 +53,6 @@ public class WelcomeActivity extends BaseDataActivity implements
         updateUI(0);
     }
 
-    @Override
-    protected void onDestroy() {
-        mViewPager.stopLoop();
-        super.onDestroy();
-    }
-
     private void setupViewPager() {
         mViewPager = findViewById(R.id.viewpager);
         mViewPager.setAutoPlay(false)

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

@@ -129,17 +129,17 @@ public class HomeFragment extends BaseFragment {
         return view;
     }
 
-    @Override
-    public void onStop() {
-        if (mBannerViewPager != null)
-            mBannerViewPager.stopLoop();
-        super.onStop();
-    }
-
-    @Override
-    public void onResume() {
-        if (mBannerViewPager != null)
-            mBannerViewPager.startLoop();
-        super.onResume();
-    }
+//    @Override
+//    public void onStop() {
+//        if (mBannerViewPager != null)
+//            mBannerViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        if (mBannerViewPager != null)
+//            mBannerViewPager.startLoop();
+//        super.onResume();
+//    }
 }

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

@@ -118,17 +118,17 @@ public class IndicatorFragment extends BaseFragment {
         startActivity(new Intent(getActivity(), PhotoViewActivity.class));
     }
 
-    @Override
-    public void onStop() {
-        if (mViewPager != null)
-            mViewPager.stopLoop();
-        super.onStop();
-    }
-
-    @Override
-    public void onResume() {
-        if (mViewPager != null)
-            mViewPager.startLoop();
-        super.onResume();
-    }
+//    @Override
+//    public void onStop() {
+//        if (mViewPager != null)
+//            mViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        super.onResume();
+//        if (mViewPager != null)
+//            mViewPager.startLoop();
+//    }
 }

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

@@ -105,17 +105,17 @@ public class PageFragment extends BaseFragment {
                 .create(mDrawableList);
     }
 
-    @Override
-    public void onStop() {
-        if (mViewPager != null)
-            mViewPager.stopLoop();
-        super.onStop();
-    }
-
-    @Override
-    public void onResume() {
-        if (mViewPager != null)
-            mViewPager.startLoop();
-        super.onResume();
-    }
+//    @Override
+//    public void onStop() {
+//        if (mViewPager != null)
+//            mViewPager.stopLoop();
+//        super.onStop();
+//    }
+//
+//    @Override
+//    public void onResume() {
+//        if (mViewPager != null)
+//            mViewPager.startLoop();
+//        super.onResume();
+//    }
 }

+ 94 - 95
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -7,6 +7,7 @@ import android.os.Handler;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.Nullable;
+import androidx.viewpager.widget.PagerAdapter;
 import androidx.viewpager.widget.ViewPager;
 
 import android.util.AttributeSet;
@@ -28,7 +29,6 @@ import com.zhpan.bannerview.indicator.IIndicator;
 import com.zhpan.bannerview.indicator.IndicatorFactory;
 import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
-import com.zhpan.bannerview.manager.IndicatorOptions;
 import com.zhpan.bannerview.transform.pagestyle.ScaleInTransformer;
 import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.bannerview.adapter.BannerPagerAdapter;
@@ -126,8 +126,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
         stopLoop();
+        super.onDetachedFromWindow();
     }
 
     @Override
@@ -136,38 +136,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         startLoop();
     }
 
-    private void initBannerData(List<T> list) {
-        if (list != null) {
-            mList.clear();
-            mList.addAll(list);
-            if (mList.size() > 0) {
-                if (mList.size() > 1) {
-                    BannerOptions bannerOptions = mBannerManager.bannerOptions();
-                    if (bannerOptions.isCustomIndicator() && null != mIndicatorView) {
-                        initIndicator(mIndicatorView);
-                    } else {
-                        initIndicator(IndicatorFactory.createIndicatorView(getContext(), bannerOptions.getIndicatorStyle()));
-                    }
-                }
-                if (isCanLoop()) {
-                    currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
-                }
-                setupViewPager();
-                setIndicatorValues();
-            }
-        }
-    }
-
-    private void setIndicatorValues() {
-        if (null != mIndicatorView) {
-            mIndicatorView.setPageSize(mList.size());
-            IndicatorOptions indicatorOptions = mBannerManager.bannerOptions().getIndicatorOptions();
-            indicatorOptions.setPageSize(mList.size());
-            mIndicatorView.setIndicatorOptions(indicatorOptions);
-            mIndicatorView.notifyDataChanged();
-        }
-    }
-
     /**
      * 设置触摸事件,当滑动或者触摸时停止自动轮播
      */
@@ -192,6 +160,63 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         });
     }
 
+    @Override
+    public void onPageSelected(int position) {
+        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, mList.size());
+        if (mOnPageChangeListener != null)
+            mOnPageChangeListener.onPageSelected(currentPosition);
+        if (mIndicatorView != null) {
+            mIndicatorView.onPageSelected(currentPosition);
+        }
+    }
+
+    @Override
+    public void onPageScrollStateChanged(int state) {
+        if (mIndicatorView != null) {
+            mIndicatorView.onPageScrollStateChanged(state);
+        }
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrollStateChanged(state);
+        }
+    }
+
+    @Override
+    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
+                    positionOffset, positionOffsetPixels);
+        }
+        if (mIndicatorView != null)
+            mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
+                    positionOffset, positionOffsetPixels);
+    }
+
+    private void initBannerData(List<T> list) {
+        if (list != null) {
+            mList.clear();
+            mList.addAll(list);
+            if (mList.size() > 0) {
+                if (mList.size() > 1) setIndicatorValues();
+                if (isCanLoop())
+                    currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
+                setupViewPager();
+                initRoundCorner();
+            }
+        }
+    }
+
+
+    private void setIndicatorValues() {
+        BannerOptions bannerOptions = mBannerManager.bannerOptions();
+        if (bannerOptions.isCustomIndicator() && null != mIndicatorView) {
+            initIndicator(mIndicatorView);
+        } else {
+            initIndicator(IndicatorFactory.createIndicatorView(getContext(), bannerOptions.getIndicatorStyle()));
+        }
+        mIndicatorView.setIndicatorOptions(bannerOptions.getIndicatorOptions());
+        mIndicatorView.setPageSize(mList.size());
+    }
+
     private void initIndicator(IIndicator indicatorView) {
         mIndicatorLayout.setVisibility(mBannerManager.bannerOptions().getIndicatorVisibility());
         mIndicatorView = indicatorView;
@@ -231,19 +256,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
+    private void initRoundCorner() {
+        int roundCorner = mBannerManager.bannerOptions().getRoundCorner();
+        if (roundCorner > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            ViewStyleSetter viewStyleSetter = new ViewStyleSetter(this);
+            viewStyleSetter.setRoundCorner(roundCorner);
+        }
+    }
+
     private void setupViewPager() {
         if (holderCreator != null) {
             removeAllViews();
-            BannerPagerAdapter<T, VH> bannerPagerAdapter =
-                    new BannerPagerAdapter<>(mList, holderCreator);
-            bannerPagerAdapter.setCanLoop(isCanLoop());
-            bannerPagerAdapter.setPageClickListener(position -> {
-                if (mOnPageClickListener != null) {
-                    mOnPageClickListener.onPageClick(position);
-                }
-            });
-
-            mViewPager.setAdapter(bannerPagerAdapter);
+            mViewPager.setAdapter(getPagerAdapter());
             mViewPager.setCurrentItem(currentPosition);
             mViewPager.addOnPageChangeListener(this);
             BannerOptions bannerOptions = mBannerManager.bannerOptions();
@@ -258,11 +282,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         } else {
             throw new NullPointerException("You must set HolderCreator for BannerViewPager");
         }
-        int roundCorner = mBannerManager.bannerOptions().getRoundCorner();
-        if (roundCorner > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            ViewStyleSetter viewStyleSetter = new ViewStyleSetter(this);
-            viewStyleSetter.setRoundCorner(roundCorner);
-        }
+    }
+
+    private PagerAdapter getPagerAdapter() {
+        BannerPagerAdapter<T, VH> bannerPagerAdapter =
+                new BannerPagerAdapter<>(mList, holderCreator);
+        bannerPagerAdapter.setCanLoop(isCanLoop());
+        bannerPagerAdapter.setPageClickListener(position -> {
+            if (mOnPageClickListener != null) {
+                mOnPageClickListener.onPageClick(position);
+            }
+        });
+        return bannerPagerAdapter;
     }
 
     private void initPageStyle() {
@@ -297,35 +328,24 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         setPageTransformer(new ScaleInTransformer(scale));
     }
 
-    @Override
-    public void onPageSelected(int position) {
-        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, mList.size());
-        if (mOnPageChangeListener != null)
-            mOnPageChangeListener.onPageSelected(currentPosition);
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageSelected(currentPosition);
-        }
+    private int getInterval() {
+        return mBannerManager.bannerOptions().getInterval();
     }
 
-    @Override
-    public void onPageScrollStateChanged(int state) {
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageScrollStateChanged(state);
-        }
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrollStateChanged(state);
-        }
+    private boolean isAutoPlay() {
+        return mBannerManager.bannerOptions().isAutoPlay();
     }
 
-    @Override
-    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
-        }
-        if (mIndicatorView != null)
-            mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
+    private boolean isLooping() {
+        return mBannerManager.bannerOptions().isLooping();
+    }
+
+    private void setLooping(boolean looping) {
+        mBannerManager.bannerOptions().setLooping(looping);
+    }
+
+    private boolean isCanLoop() {
+        return mBannerManager.bannerOptions().isCanLoop();
     }
 
     /**
@@ -355,27 +375,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-
-    private int getInterval() {
-        return mBannerManager.bannerOptions().getInterval();
-    }
-
-    private boolean isAutoPlay() {
-        return mBannerManager.bannerOptions().isAutoPlay();
-    }
-
-    private boolean isLooping() {
-        return mBannerManager.bannerOptions().isLooping();
-    }
-
-    private void setLooping(boolean looping) {
-        mBannerManager.bannerOptions().setLooping(looping);
-    }
-
-    private boolean isCanLoop() {
-        return mBannerManager.bannerOptions().isCanLoop();
-    }
-
     /**
      * 必须为BannerViewPager设置HolderCreator,HolderCreator中创建ViewHolder,
      * 在ViewHolder中管理BannerViewPager的ItemView.

+ 3 - 8
bannerview/src/main/java/com/zhpan/bannerview/manager/AttributeController.java

@@ -37,14 +37,9 @@ public class AttributeController {
     }
 
     private void initIndicatorAttrs(TypedArray typedArray) {
-        int indicatorCheckedColor =
-                typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_checked_color,
-                        Color.parseColor("#8C18171C"));
-        int indicatorNormalColor =
-                typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_normal_color,
-                        Color.parseColor("#8C6C6D72"));
-        int normalIndicatorWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_indicator_radius,
-                BannerUtils.dp2px(8));
+        int indicatorCheckedColor = typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_checked_color, Color.parseColor("#8C18171C"));
+        int indicatorNormalColor = typedArray.getColor(R.styleable.BannerViewPager_bvp_indicator_normal_color, Color.parseColor("#8C6C6D72"));
+        int normalIndicatorWidth = (int) typedArray.getDimension(R.styleable.BannerViewPager_bvp_indicator_radius, BannerUtils.dp2px(8));
         int indicatorGravity = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_gravity, 0);
         int indicatorStyle = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_style, 0);
         int indicatorSlideMode = typedArray.getInt(R.styleable.BannerViewPager_bvp_indicator_slide_mode, 0);