Browse Source

2.5.1 (#44)

* Fix bug #41

* Optimized Code For Issue #42

* Update README
zhpanvip 5 years ago
parent
commit
8839ba6f6a

+ 10 - 1
README.md

@@ -5,6 +5,10 @@
 [![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)
 
+
+> 腾讯视频、QQ音乐、酷狗音乐、支付宝、天猫、淘宝、优酷视频、喜马拉雅、网易云音乐、哔哩哔哩、全民K歌等App的Banner样式都可以通过BannerViewPager实现哦!
+
+
 ## 效果预览
 
  ### [点击或扫描二维码下载apk](https://github.com/zhpanvip/BannerViewPager/raw/master/download/app.apk)
@@ -384,14 +388,19 @@ public class FigureIndicatorView extends BaseIndicatorView {
  - [x] 目前Indicator部分代码比较乱,还有很大很大的优化空间,后续版本将持续优化(2.5.0对Indicator再次进行了重构,重构后代码已经很整洁,但仍然有优化空间)
  - [ ] ViewPager更换为ViewPager2 (3.0.0)
 
- 
+
+## 有问题可以扫码加QQ群交流
+
+ ![QQ交流群60902509](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qq_group.png)
 
 
 ##  更多详情请参看以下链接
 
 [《打造一个丝滑般自动轮播无限循环Android库》](https://juejin.im/post/5d6bce24f265da03db0790d1)
+
 [《BannerViewPager源码解析》](https://juejin.im/post/5d74d3faf265da03b5747015)
 
+[《剖析BannerViewPager中Indicator的设计思想》](https://juejin.im/post/5dda0b6d518825731f569a8c)
 
 ## 感谢
 

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

@@ -15,7 +15,6 @@ 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.IndicatorStyle
 import com.zhpan.bannerview.constants.TransformerStyle
 import com.zhpan.bannerview.holder.HolderCreator
 import com.zhpan.bannerview.utils.BannerUtils

+ 4 - 3
app/src/main/java/com/example/zhpan/circleviewpager/fragment/BaseFragment.kt

@@ -34,14 +34,15 @@ abstract class BaseFragment : RxFragment() {
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         val view = inflater.inflate(layout, container, false)
-        initData()
+        initData(3)
         initTitle()
         initView(savedInstanceState, view)
         return view
     }
 
-    private fun initData() {
-        for (i in 0..3) {
+    protected fun initData(j: Int) {
+        mDrawableList.clear()
+        for (i in 0..j) {
             val drawable = resources.getIdentifier("t$i", "drawable", mContext.packageName)
             mDrawableList.add(drawable)
         }

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

@@ -1,15 +1,10 @@
 package com.example.zhpan.circleviewpager.fragment;
 
 import android.os.Bundle;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
 import com.zhpan.bannerview.BannerViewPager;
@@ -19,6 +14,8 @@ import com.zhpan.bannerview.indicator.IndicatorView;
 import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.idea.utils.ToastUtils;
 
+import java.util.Random;
+
 /**
  * Created by zhpan on 2018/7/24.
  */
@@ -53,6 +50,15 @@ public class PageFragment extends BaseFragment {
                 .setOnPageClickListener(position -> ToastUtils.show("position:" + position))
                 .setInterval(5000);
         initRadioGroup();
+
+        view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
+    }
+
+    private void updateData() {
+        //  生成[-1,3]整数
+        initData(new Random().nextInt(5) - 1);
+        ToastUtils.show("size=" + getMDrawableList().size());
+        mViewPager.create(getMDrawableList());
     }
 
     public static PageFragment getInstance() {
@@ -84,6 +90,10 @@ public class PageFragment extends BaseFragment {
 //                    mViewPager.resetIndicator();
                     setupOverlapBanner();
                     break;
+                case R.id.rb_multi_page_wy:
+                    indicatorView.setVisibility(View.INVISIBLE);
+                    setNetEaseMusicStyle();
+                    break;
             }
         });
         radioButton.performClick();
@@ -96,4 +106,16 @@ public class PageFragment extends BaseFragment {
                 .setIndicatorView(indicatorView)
                 .create(getMDrawableList());
     }
+
+    //  网易云音乐、QQ音乐类似的Banner都可以通过设置不同的pargeMargin和revealWidth来实现
+    private void setNetEaseMusicStyle() {
+        mViewPager
+                .setPageMargin(BannerUtils.dp2px(30))
+                .setRevealWidth(BannerUtils.dp2px(-15))
+                .setPageStyle(PageStyle.MULTI_PAGE)
+                .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).create(getMDrawableList());
+    }
 }

+ 0 - 9
app/src/main/res/layout/activity_custom_indicator.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".activity.CustomIndicatorActivity">
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 49
app/src/main/res/layout/activity_indicator_slide_mode.xml

@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <com.zhpan.bannerview.BannerViewPager
-        android:id="@+id/banner_view_dash"
-        android:layout_width="match_parent"
-        android:layout_height="180dp"
-        android:layout_margin="10dp"
-        app:bvp_indicator_visibility="visible"
-        app:bvp_round_corner="8dp" />
-
-    <RadioGroup
-        android:id="@+id/rg_indicator_style"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:padding="15dp"
-        android:visibility="gone">
-
-        <RadioButton
-            android:id="@+id/rb_circle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:text="Circle"
-            android:textSize="16sp" />
-
-        <RadioButton
-            android:id="@+id/rb_dash"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:text="Dash"
-            android:textSize="16sp" />
-
-        <RadioButton
-            android:id="@+id/rb_custom"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Custom"
-            android:textSize="16sp" />
-    </RadioGroup>
-
-</LinearLayout>

+ 0 - 54
app/src/main/res/layout/activity_page_style.xml

@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <com.zhpan.bannerview.BannerViewPager
-        android:id="@+id/banner_view"
-        android:layout_width="match_parent"
-        android:layout_height="180dp"
-        android:layout_marginTop="20dp"
-        app:bvp_page_style="multi_page" />
-
-    <com.zhpan.bannerview.indicator.IndicatorView
-        android:id="@+id/indicator_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dp"
-        android:layout_centerHorizontal="true"
-        android:layout_below="@id/banner_view" />
-
-    <RadioGroup
-        android:id="@+id/rg_indicator_style"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/banner_view"
-        android:layout_marginTop="20dp"
-        android:padding="15dp">
-
-        <RadioButton
-            android:id="@+id/rb_multi_page"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:text="MULTI_PAGE" />
-
-        <RadioButton
-            android:id="@+id/rb_multi_page_scale"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="15dp"
-            android:text="MULTI_PAGE_SCALE" />
-
-        <RadioButton
-            android:id="@+id/rb_multi_page_overlap"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="15dp"
-            android:text="MULTI_PAGE_OVERLAP" />
-
-    </RadioGroup>
-
-</RelativeLayout>

+ 16 - 1
app/src/main/res/layout/fragment_find.xml

@@ -24,9 +24,9 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@id/indicator_view"
+        android:layout_marginStart="10dp"
         android:text="@string/text_page_style"
         android:textColor="#000000"
-        android:layout_marginStart="10dp"
         android:textSize="18sp"
         android:textStyle="bold" />
 
@@ -58,6 +58,21 @@
             android:layout_marginTop="15dp"
             android:text="MULTI_PAGE_OVERLAP" />
 
+        <RadioButton
+            android:id="@+id/rb_multi_page_wy"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="15dp"
+            android:text="仿网易云(QQ)音乐Banner" />
+
     </RadioGroup>
 
+    <Button
+        android:id="@+id/btn_refresh"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:text="Refresh Data" />
+
 </RelativeLayout>

+ 23 - 27
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -135,6 +135,11 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     public void onPageSelected(int position) {
+        // Optimized For Issue #42
+        if (mList.size() > 0 && isCanLoop() && position == 0) {
+            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
+            setCurrentItem(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()));
+        }
         currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, mList.size());
         if (mOnPageChangeListener != null)
             mOnPageChangeListener.onPageSelected(currentPosition);
@@ -167,37 +172,29 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     private void handlePosition() {
         if (mList.size() > 1) {
             currentPosition = mViewPager.getCurrentItem() + 1;
-            if (isCanLoop()) {
-                if (currentPosition == MAX_VALUE - 1) {
-                    currentPosition = 0;
-                    mViewPager.setCurrentItem(currentPosition, false);
-                    mHandler.post(mRunnable);
-                } else {
-                    mViewPager.setCurrentItem(currentPosition);
-                    mHandler.postDelayed(mRunnable, getInterval());
-                }
-            } else {
-                if (currentPosition >= MAX_VALUE) {
-                    stopLoop();
-                } else {
-                    mViewPager.setCurrentItem(currentPosition);
-                    mHandler.postDelayed(mRunnable, getInterval());
-                }
-            }
+            mViewPager.setCurrentItem(currentPosition);
+            mHandler.postDelayed(mRunnable, getInterval());
         }
     }
 
     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();
-            }
+            initList(list);
+            setupViewPager();
+            initRoundCorner();
+        }
+    }
+
+    private void initList(List<T> list) {
+        mList.clear();
+        mList.addAll(list);
+        if (mList.size() > 1) {
+            setIndicatorValues();
+        } else if (mIndicatorView != null) {
+            mIndicatorView.setPageSize(mList.size());
+        }
+        if (mList.size() > 0 && isCanLoop()) {
+            currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
         }
     }
 
@@ -206,7 +203,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         if (bannerOptions.isCustomIndicator() && null != mIndicatorView) {
             initIndicator(mIndicatorView);
         } else {
-//            initIndicator(IndicatorFactory.createIndicatorView(getContext(), bannerOptions.getIndicatorStyle()));
             initIndicator(new IndicatorView(getContext()));
         }
         mIndicatorView.setIndicatorOptions(bannerOptions.getIndicatorOptions());

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

@@ -27,11 +27,11 @@ public abstract class BaseDrawer implements IDrawer {
 
     public class MeasureResult {
 
-        public int measureWidth;
+        int measureWidth;
 
-        public int measureHeight;
+        int measureHeight;
 
-        public void setMeasureResult(int measureWidth, int measureHeight) {
+        void setMeasureResult(int measureWidth, int measureHeight) {
             this.measureWidth = measureWidth;
             this.measureHeight = measureHeight;
         }

+ 1 - 1
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/CircleDrawer.java

@@ -16,7 +16,7 @@ public class CircleDrawer extends BaseDrawer {
 
     private float minWidth;
 
-    public CircleDrawer(IndicatorOptions indicatorOptions) {
+    CircleDrawer(IndicatorOptions indicatorOptions) {
         super(indicatorOptions);
     }
 

+ 1 - 1
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DashDrawer.java

@@ -17,7 +17,7 @@ public class DashDrawer extends BaseDrawer {
 
     private float minWidth;
 
-    public DashDrawer(IndicatorOptions indicatorOptions) {
+    DashDrawer(IndicatorOptions indicatorOptions) {
         super(indicatorOptions);
     }
 

+ 23 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerFactory.java

@@ -0,0 +1,23 @@
+package com.zhpan.bannerview.indicator.drawer;
+
+import com.zhpan.bannerview.manager.IndicatorOptions;
+
+import static com.zhpan.bannerview.constants.IndicatorStyle.DASH;
+
+/**
+ * <pre>
+ *   Created by zhpan on 2019/11/24.
+ *   Description: Indicator Drawer Factory.
+ * </pre>
+ */
+class DrawerFactory {
+    static IDrawer createDrawer(IndicatorOptions indicatorOptions) {
+        IDrawer drawer;
+        if (indicatorOptions.getIndicatorStyle() == DASH) {
+            drawer = new DashDrawer(indicatorOptions);
+        } else {
+            drawer = new CircleDrawer(indicatorOptions);
+        }
+        return drawer;
+    }
+}

+ 3 - 10
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerProxy.java

@@ -13,8 +13,8 @@ import static com.zhpan.bannerview.constants.IndicatorStyle.DASH;
  *   Description: Indicator Drawer Proxy.
  * </pre>
  */
-public class DrawerProxy implements IDrawer{
-    
+public class DrawerProxy implements IDrawer {
+
     private IDrawer mIDrawer;
 
     public DrawerProxy(IndicatorOptions indicatorOptions) {
@@ -22,14 +22,7 @@ public class DrawerProxy implements IDrawer{
     }
 
     private void init(IndicatorOptions indicatorOptions) {
-        switch (indicatorOptions.getIndicatorStyle()) {
-            case CIRCLE:
-                mIDrawer = new CircleDrawer(indicatorOptions);
-                break;
-            case DASH:
-                mIDrawer = new DashDrawer(indicatorOptions);
-                break;
-        }
+        mIDrawer = DrawerFactory.createDrawer(indicatorOptions);
     }
 
     public void setIndicatorOptions(IndicatorOptions indicatorOptions) {

BIN
download/app.apk


BIN
image/qq_group.png