Explorar o código

Fix bug #55 Sliding conflict with ViewPager2

zhpanvip %!s(int64=5) %!d(string=hai) anos
pai
achega
236ac7f14d

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

@@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity() {
     private fun initData() {
         vp_fragment.adapter = AdapterFragmentPager(this)
         vp_fragment.offscreenPageLimit = 3
-        vp_fragment.isUserInputEnabled = false
+        vp_fragment.isUserInputEnabled = true
         vp_fragment.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
             override fun onPageSelected(position: Int) {
                 super.onPageSelected(position)

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

@@ -9,7 +9,7 @@
         android:id="@+id/banner_view"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dp_180"
-        android:layout_margin="@dimen/dp_10"
+        android:padding="@dimen/dp_10"
         app:bvp_indicator_visibility="visible"
         app:bvp_round_corner="@dimen/dp_8" />
 

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

@@ -13,7 +13,7 @@
             android:id="@+id/banner_view"
             android:layout_width="match_parent"
             android:layout_height="@dimen/dp_180"
-            android:layout_margin="@dimen/dp_10"
+            android:padding="@dimen/dp_10"
             app:bvp_indicator_visibility="visible"
             app:bvp_round_corner="@dimen/dp_8" />
 

+ 34 - 44
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -75,6 +75,8 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     };
 
+    private int startX, startY;
+
     public BannerViewPager(Context context) {
         this(context, null);
     }
@@ -112,60 +114,49 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         startLoop();
     }
 
-    //  触碰控件的时候,翻页应该停止,离开的时候如果之前是开启了翻页的话则重新启动翻页
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                setLooping(true);
+                stopLoop();
+                startX = (int) ev.getX();
+                startY = (int) ev.getY();
+                getParent().requestDisallowInterceptTouchEvent(true);
+                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) {
+                    if (!isCanLoop()) {
+                        if (currentPosition == 0 && endX - startX > 0) {
+                            getParent().requestDisallowInterceptTouchEvent(false);
+                        } else if (currentPosition == getList().size() - 1 && endX - startX < 0) {
+                            getParent().requestDisallowInterceptTouchEvent(false);
+                        } else {
+                            getParent().requestDisallowInterceptTouchEvent(true);
+                        }
+                    } else {
+                        getParent().requestDisallowInterceptTouchEvent(true);
+                    }
+                }
+                break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_OUTSIDE:
                 setLooping(false);
                 startLoop();
+                getParent().requestDisallowInterceptTouchEvent(false);
                 break;
-            case MotionEvent.ACTION_DOWN:
-                setLooping(true);
-                stopLoop();
+            case MotionEvent.ACTION_OUTSIDE:
+                setLooping(false);
+                startLoop();
                 break;
         }
         return super.dispatchTouchEvent(ev);
     }
 
-//    private int startX, startY;
-//    @Override
-//    public boolean dispatchTouchEvent(MotionEvent ev) {
-//        switch (ev.getAction()) {
-//            case MotionEvent.ACTION_DOWN:
-//                setLooping(true);
-//                stopLoop();
-//                startX = (int) ev.getX();
-//                startY = (int) ev.getY();
-//                getParent().requestDisallowInterceptTouchEvent(true);
-//                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(true);
-//                } else {
-//                    getParent().requestDisallowInterceptTouchEvent(false);
-//                }
-//                break;
-//            case MotionEvent.ACTION_UP:
-//            case MotionEvent.ACTION_CANCEL:
-//                setLooping(false);
-//                startLoop();
-//                getParent().requestDisallowInterceptTouchEvent(false);
-//                break;
-//            case MotionEvent.ACTION_OUTSIDE:
-//                setLooping(false);
-//                startLoop();
-//                break;
-//        }
-//        return super.dispatchTouchEvent(ev);
-//    }
-
     @Override
     public void onPageSelected(int position) {
         int size = mBannerPagerAdapter.getListSize();
@@ -770,7 +761,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      *
      * @param normalRadius  unchecked circle radius
      * @param checkedRadius checked circle radius
-     * @deprecated use {@link #setIndicatorSliderRadius(int,int)} instead
+     * @deprecated use {@link #setIndicatorSliderRadius(int, int)} instead
      */
     @Deprecated
     public BannerViewPager<T, VH> setIndicatorRadius(int normalRadius, int checkedRadius) {
@@ -810,8 +801,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
 
     /**
-     *
-     * @deprecated Use {@link #setIndicatorSliderWidth(int,int)} instead.
+     * @deprecated Use {@link #setIndicatorSliderWidth(int, int)} instead.
      */
     @Deprecated
     public BannerViewPager<T, VH> setIndicatorWidth(int normalWidth, int checkWidth) {