浏览代码

Merge pull request #91 from zhpanvip/bug_vp2

Fix bug #55 Sliding conflict with ViewPager2
zhpanvip 5 年之前
父节点
当前提交
b21b21d7a3

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

@@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity() {
     private fun initData() {
     private fun initData() {
         vp_fragment.adapter = AdapterFragmentPager(this)
         vp_fragment.adapter = AdapterFragmentPager(this)
         vp_fragment.offscreenPageLimit = 3
         vp_fragment.offscreenPageLimit = 3
-        vp_fragment.isUserInputEnabled = false
+        vp_fragment.isUserInputEnabled = true
         vp_fragment.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
         vp_fragment.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
             override fun onPageSelected(position: Int) {
             override fun onPageSelected(position: Int) {
                 super.onPageSelected(position)
                 super.onPageSelected(position)
@@ -37,8 +37,8 @@ class MainActivity : AppCompatActivity() {
     private fun getCheckedId(position: Int): Int {
     private fun getCheckedId(position: Int): Int {
         return when (position) {
         return when (position) {
             0 -> R.id.rb_home
             0 -> R.id.rb_home
-            1 -> R.id.rb_find
-            2 -> R.id.rb_add
+            1 -> R.id.rb_add
+            2 -> R.id.rb_find
             3 -> R.id.rb_others
             3 -> R.id.rb_others
             else -> R.id.rb_home
             else -> R.id.rb_home
         }
         }
@@ -48,8 +48,8 @@ class MainActivity : AppCompatActivity() {
         rg_tab?.setOnCheckedChangeListener { _, checkedId ->
         rg_tab?.setOnCheckedChangeListener { _, checkedId ->
             when (checkedId) {
             when (checkedId) {
                 R.id.rb_home -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_HOME, false)
                 R.id.rb_home -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_HOME, false)
-                R.id.rb_find -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_FIND, false)
-                R.id.rb_add -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_INDICATOR, false)
+                R.id.rb_add -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_FIND, false)
+                R.id.rb_find -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_INDICATOR, false)
                 R.id.rb_others -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, false)
                 R.id.rb_others -> vp_fragment.setCurrentItem(AdapterFragmentPager.PAGE_OTHERS, false)
             }
             }
         }
         }

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

@@ -136,7 +136,8 @@ public class HomeFragment extends BaseFragment {
 
 
     private void initBanner() {
     private void initBanner() {
         mViewPager
         mViewPager
-                .setAutoPlay(true)
+                .setAutoPlay(false)
+                .setCanLoop(false)
                 .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setInterval(5000)
                 .setInterval(5000)
                 .setScrollDuration(1200)
                 .setScrollDuration(1200)

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