Explorar o código

处理竖直滑动时滑动冲突问题

zhpanvip %!s(int64=5) %!d(string=hai) anos
pai
achega
2019557bed

+ 62 - 8
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -175,9 +175,6 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
                 startY = (int) ev.getY();
                 getParent().requestDisallowInterceptTouchEvent(true);
                 break;
-            case MotionEvent.ACTION_MOVE:
-                onActionMove(ev);
-                break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
                 setLooping(false);
@@ -189,9 +186,61 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
                 startLoop();
                 break;
         }
+        int orientation = mBannerManager.bannerOptions().getOrientation();
+        if (orientation == ViewPager2.ORIENTATION_VERTICAL) {
+            dispatchVerticalTouchEvent(ev);
+        } else if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
+            dispatchHorizontalTouchEvent(ev);
+        }
         return super.dispatchTouchEvent(ev);
     }
 
+    private void dispatchHorizontalTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                startX = (int) ev.getX();
+                startY = (int) ev.getY();
+                getParent().requestDisallowInterceptTouchEvent(true);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                onActionMove(ev);
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                getParent().requestDisallowInterceptTouchEvent(false);
+                break;
+            case MotionEvent.ACTION_OUTSIDE:
+                break;
+        }
+    }
+
+    private void dispatchVerticalTouchEvent(MotionEvent ev) {
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                startX = (int) ev.getX();
+                startY = (int) ev.getY();
+                getParent().requestDisallowInterceptTouchEvent(false);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                int endX = (int) ev.getX();
+                int endY = (int) ev.getY();
+                int disX = Math.abs(endX - startX);
+                int disY = Math.abs(endY - startY);
+                if(disX>disY){
+                    getParent().requestDisallowInterceptTouchEvent(false);
+                }else {
+                    getParent().requestDisallowInterceptTouchEvent(true);
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                getParent().requestDisallowInterceptTouchEvent(true);
+                break;
+            case MotionEvent.ACTION_OUTSIDE:
+                break;
+        }
+    }
+
     private void onActionMove(MotionEvent ev) {
         int endX = (int) ev.getX();
         int endY = (int) ev.getY();
@@ -305,10 +354,10 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
         mViewPager.unregisterOnPageChangeCallback(mOnPageChangeCallback);
         mViewPager.registerOnPageChangeCallback(mOnPageChangeCallback);
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
+        mViewPager.setOrientation(bannerOptions.getOrientation());
         mViewPager.setUserInputEnabled(!bannerOptions.isUserInputEnabled());
 //        mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
         mViewPager.setOffscreenPageLimit(bannerOptions.getOffScreenPageLimit());
-
         initPageStyle();
         startLoop();
     }
@@ -328,17 +377,22 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
     }
 
     private void setMultiPageStyle(boolean overlap, float scale) {
-        mViewPager.setOffscreenPageLimit(1);
+//        mViewPager.setOffscreenPageLimit(1);
         RecyclerView recyclerView = (RecyclerView) mViewPager.getChildAt(0);
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
+        int orientation = bannerOptions.getOrientation();
         int padding = bannerOptions.getPageMargin() + bannerOptions.getRevealWidth();
-        recyclerView.setPadding(padding, 0, padding, 0);
+        if (orientation == ViewPager2.ORIENTATION_HORIZONTAL)
+            recyclerView.setPadding(padding, 0, padding, 0);
+        else if (orientation == ViewPager2.ORIENTATION_VERTICAL) {
+            recyclerView.setPadding(0, padding, 0, padding);
+        }
         recyclerView.setClipToPadding(false);
         if (mPageTransformer != null) {
             mCompositePageTransformer.removeTransformer(mPageTransformer);
         }
         if (overlap && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            mPageTransformer = new OverlapSliderTransformer(ViewPager2.ORIENTATION_HORIZONTAL, scale, scale, 0, 0);
+            mPageTransformer = new OverlapSliderTransformer(orientation, scale, scale, 0, 0);
         } else {
             mPageTransformer = new ScaleInTransformer(scale);
         }
@@ -690,7 +744,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
      * @param orientation {@link ##ORIENTATION_HORIZONTAL} or {@link ##ORIENTATION_VERTICAL}
      */
     public BannerViewPager<T, VH> setOrientation(@ViewPager2.Orientation int orientation) {
-        mViewPager.setOrientation(orientation);
+        mBannerManager.bannerOptions().setOrientation(orientation);
         return this;
     }
 

+ 10 - 0
bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java

@@ -52,6 +52,8 @@ public class BannerOptions {
 
     private boolean userInputEnabled;
 
+    private int orientation = ViewPager2.ORIENTATION_HORIZONTAL;
+
     private IndicatorOptions mIndicatorOptions;
 
     public int getInterval() {
@@ -220,6 +222,14 @@ public class BannerOptions {
         mIndicatorVisibility = indicatorVisibility;
     }
 
+    public int getOrientation() {
+        return orientation;
+    }
+
+    public void setOrientation(int orientation) {
+        this.orientation = orientation;
+    }
+
     public boolean isUserInputEnabled() {
         return userInputEnabled;
     }