Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

zhpanvip 4 ani în urmă
părinte
comite
479182715f

+ 18 - 7
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -25,6 +25,7 @@ import com.zhpan.bannerview.annotation.Visibility;
 import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
+import com.zhpan.bannerview.provider.ReflectLayoutManager;
 import com.zhpan.bannerview.provider.ScrollDurationManger;
 import com.zhpan.bannerview.provider.ViewStyleSetter;
 import com.zhpan.bannerview.utils.BannerUtils;
@@ -355,7 +356,7 @@ public class BannerViewPager<T> extends RelativeLayout implements LifecycleObser
         }
         BannerOptions bannerOptions = mBannerManager.getBannerOptions();
         if (bannerOptions.getScrollDuration() != 0) {
-            ScrollDurationManger.reflectLayoutManager(mViewPager, bannerOptions.getScrollDuration());
+            ReflectLayoutManager.reflectLayoutManager(mViewPager, bannerOptions.getScrollDuration());
         }
         currentPosition = 0;
         mBannerPagerAdapter.setCanLoop(bannerOptions.isCanLoop());
@@ -1017,13 +1018,23 @@ public class BannerViewPager<T> extends RelativeLayout implements LifecycleObser
     }
 
     /**
-     * 设置是否允许BVP对事件进行拦截,用于解决CoordinatorLayout+CollapsingToolbarLayout
-     * 在嵌套BVP时引起的滑动冲突问题。
-     * BVP在处理ViewPager2嵌套滑动冲突时,在{@link #onInterceptTouchEvent(MotionEvent)}方法中
-     * 对事件进行了处理导致CoordinatorLayout+CollapsingToolbarLayout的布局中滑动BVP的事件无效。
-     * 对于这种情况可以调用该方法来禁止BVP对事件进行拦截。
+     * 设置是否允许在BVP的{@link MotionEvent#ACTION_DOWN}事件中禁止父View对事件的拦截,该方法
+     * 用于解决CoordinatorLayout+CollapsingToolbarLayout在嵌套BVP时引起的滑动冲突问题。
+     * <p>
+     * BVP在处理ViewPager2嵌套滑动冲突时,在{@link #onInterceptTouchEvent(MotionEvent)}
+     * 方法的{@link MotionEvent#ACTION_DOWN}事件中禁止了BVP的父View对触摸事件的拦截,
+     * 导致CollapsingToolbarLayout的布局无法获取{@link MotionEvent#ACTION_DOWN}事件,
+     * 致使CollapsingToolbarLayout无法处理down事件后的一系列事件而无法滑动。
+     * 对于这种情况可以调用该方法不允许在BVP在{@link MotionEvent#ACTION_DOWN}事件中禁止父View的事件拦截。
+     * </p>
+     * 调用该方法将disallowIntercept设置为true后虽然解决了滑动冲突,但也会造成一定的不良影响,即如果BVP设置
+     * 水平滑动,同时BVP外部也是可以水平滑动的ViewPager,则存在较小概率的滑动冲突,即滑动BVP的同时可能会触发
+     * 外部ViewPager的滑动。但这一问题到目前为止似乎没有好的解决方案。
      *
-     * @param disallowIntercept true 禁止BVP拦截事件,false 允许BVP拦截事件
+     * @param disallowIntercept 是否允许BVP在{@link MotionEvent#ACTION_DOWN}事件中禁止父View拦截事件,默认值为false
+     *                          true 不允许BVP在{@link MotionEvent#ACTION_DOWN}时间中禁止父View的时间拦截,
+     *                          设置disallowIntercept为true可以解决CoordinatorLayout+CollapsingToolbarLayout的滑动冲突
+     *                          false 允许BVP在{@link MotionEvent#ACTION_DOWN}时间中禁止父View的时间拦截,
      */
     public BannerViewPager<T> disallowInterceptTouchEvent(boolean disallowIntercept) {
         mBannerManager.getBannerOptions().setDisallowIntercept(disallowIntercept);

+ 57 - 0
bannerview/src/main/java/com/zhpan/bannerview/provider/ReflectLayoutManager.java

@@ -0,0 +1,57 @@
+package com.zhpan.bannerview.provider;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.ViewPager2;
+
+import java.lang.reflect.Field;
+
+/**
+ * 通过反射修改页面滑动的时间
+ * Thanks:https://github.com/zguop/banner/blob/master/pager2banner/src/main/java/com/to/aboomy/pager2banner/Banner.java
+ */
+public class ReflectLayoutManager {
+
+    public static void reflectLayoutManager(ViewPager2 viewPager2, int scrollDuration) {
+        try {
+            RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0);
+            recyclerView.setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
+            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+            if (linearLayoutManager == null) {
+                return;
+            }
+            ScrollDurationManger scrollDurationManger = new ScrollDurationManger(viewPager2, scrollDuration, linearLayoutManager);
+            recyclerView.setLayoutManager(scrollDurationManger);
+
+            Field mRecyclerField = RecyclerView.LayoutManager.class.getDeclaredField("mRecyclerView");
+            mRecyclerField.setAccessible(true);
+            mRecyclerField.set(linearLayoutManager, recyclerView);
+            Field layoutMangerField = ViewPager2.class.getDeclaredField("mLayoutManager");
+            layoutMangerField.setAccessible(true);
+            layoutMangerField.set(viewPager2, scrollDurationManger);
+
+            Field pageTransformerAdapterField = ViewPager2.class.getDeclaredField("mPageTransformerAdapter");
+            pageTransformerAdapterField.setAccessible(true);
+            Object mPageTransformerAdapter = pageTransformerAdapterField.get(viewPager2);
+            if (mPageTransformerAdapter != null) {
+                Class<?> aClass = mPageTransformerAdapter.getClass();
+                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
+                layoutManager.setAccessible(true);
+                layoutManager.set(mPageTransformerAdapter, scrollDurationManger);
+            }
+            Field scrollEventAdapterField = ViewPager2.class.getDeclaredField("mScrollEventAdapter");
+            scrollEventAdapterField.setAccessible(true);
+            Object mScrollEventAdapter = scrollEventAdapterField.get(viewPager2);
+            if (mScrollEventAdapter != null) {
+                Class<?> aClass = mScrollEventAdapter.getClass();
+                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
+                layoutManager.setAccessible(true);
+                layoutManager.set(mScrollEventAdapter, scrollDurationManger);
+            }
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 2 - 46
bannerview/src/main/java/com/zhpan/bannerview/provider/ScrollDurationManger.java

@@ -18,9 +18,9 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
-
 /**
- * thanks:https://github.com/zguop/banner/blob/master/pager2banner/src/main/java/com/to/aboomy/pager2banner/Banner.java
+ * @author zhangpan
+ * @date 2020/12/21
  */
 public class ScrollDurationManger extends LinearLayoutManager {
     private final LinearLayoutManager mParent;
@@ -81,48 +81,4 @@ public class ScrollDurationManger extends LinearLayoutManager {
                                                  boolean focusedChildVisible) {
         return false; // users should use setCurrentItem instead
     }
-
-    public static void reflectLayoutManager(ViewPager2 viewPager2, int scrollDuration) {
-        try {
-            RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0);
-            recyclerView.setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
-            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
-            if (linearLayoutManager == null) {
-                return;
-            }
-            ScrollDurationManger speedManger = new ScrollDurationManger(viewPager2, scrollDuration, linearLayoutManager);
-            recyclerView.setLayoutManager(speedManger);
-
-            Field mRecyclerView = RecyclerView.LayoutManager.class.getDeclaredField("mRecyclerView");
-            mRecyclerView.setAccessible(true);
-            mRecyclerView.set(linearLayoutManager, recyclerView);
-
-            Field layoutMangerField = ViewPager2.class.getDeclaredField("mLayoutManager");
-            layoutMangerField.setAccessible(true);
-            layoutMangerField.set(viewPager2, speedManger);
-
-            Field pageTransformerAdapterField = ViewPager2.class.getDeclaredField("mPageTransformerAdapter");
-            pageTransformerAdapterField.setAccessible(true);
-            Object mPageTransformerAdapter = pageTransformerAdapterField.get(viewPager2);
-            if (mPageTransformerAdapter != null) {
-                Class<?> aClass = mPageTransformerAdapter.getClass();
-                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
-                layoutManager.setAccessible(true);
-                layoutManager.set(mPageTransformerAdapter, speedManger);
-            }
-            Field scrollEventAdapterField = ViewPager2.class.getDeclaredField("mScrollEventAdapter");
-            scrollEventAdapterField.setAccessible(true);
-            Object mScrollEventAdapter = scrollEventAdapterField.get(viewPager2);
-            if (mScrollEventAdapter != null) {
-                Class<?> aClass = mScrollEventAdapter.getClass();
-                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
-                layoutManager.setAccessible(true);
-                layoutManager.set(mScrollEventAdapter, speedManger);
-            }
-        } catch (NoSuchFieldException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        }
-    }
 }