| package com.doumee.lib_coremodel.view.swipmenu; | 
|   | 
| import android.content.Context; | 
| import android.util.AttributeSet; | 
| import android.view.MotionEvent; | 
|   | 
| import androidx.viewpager.widget.PagerAdapter; | 
| import androidx.viewpager.widget.ViewPager; | 
|   | 
| /** | 
|  * Intro: 解决 滑动冲突的 ViewPager | 
|  * <p> | 
|  * 因为ViewPager 和 SwipMenuLayout都是水平方向滑动的控件。 | 
|  * 所以在一起使用时会有冲突, | 
|  * 使用本控件(CstViewPager),可以在ViewPager的第一页使用左滑。在ViewPager的最后一页使用右滑菜单。 | 
|  * <p> | 
|  * Author: zhangxutong | 
|  * E-mail: mcxtzhang@163.com | 
|  * Home Page: http://blog.csdn.net/zxt0601 | 
|  * Created:   2017/9/27. | 
|  * History: | 
|  */ | 
|   | 
| public class CstViewPager extends ViewPager { | 
|     private static final String TAG = "zxt/CstViewPager"; | 
|   | 
|     private int mLastX, mLastY; | 
|   | 
|   | 
|     public CstViewPager(Context context) { | 
|         super(context); | 
|     } | 
|   | 
|     public CstViewPager(Context context, AttributeSet attrs) { | 
|         super(context, attrs); | 
|     } | 
|   | 
|     @Override | 
|     public boolean onInterceptTouchEvent(MotionEvent ev) { | 
|         //Log.i(TAG, "onInterceptTouchEvent() called with: ev = [" + ev + "]"); | 
|         int x = (int) ev.getX(); | 
|         int y = (int) ev.getY(); | 
|         boolean intercept = false; | 
|         switch (ev.getAction()) { | 
|             case MotionEvent.ACTION_DOWN: | 
|                 break; | 
|             case MotionEvent.ACTION_MOVE: | 
|                 if (isHorizontalScroll(x, y)) { | 
|                     //除了在 第一页的手指向右滑 , 最后一页的左滑,其他时刻都是父控件需要拦截事件 | 
|                     if (isReactFirstPage() && isScrollRight(x)) { | 
|                         //Log.e(TAG, "第一页的手指向右滑]"); | 
|                         intercept = false; | 
|                     } else if (isReachLastPage() && isScrollLeft(x)) { | 
|                         //Log.e(TAG, "最后一页的左滑"); | 
|                         intercept = false; | 
|                     } else { | 
|                         //Log.e(TAG, "其他情况"); | 
|                         intercept = true; | 
|                     } | 
|   | 
|                 } else { | 
|   | 
|                 } | 
|                 break; | 
|             case MotionEvent.ACTION_UP: | 
|                 break; | 
|             default: | 
|                 break; | 
|         } | 
|   | 
|         mLastX = x; | 
|         mLastY = y; | 
|   | 
|         boolean onInterceptTouchEvent = super.onInterceptTouchEvent(ev); | 
|         return intercept || onInterceptTouchEvent; | 
|     } | 
|   | 
|     @Override | 
|     public boolean onTouchEvent(MotionEvent ev) { | 
|         //Log.i(TAG, "onTouchEvent() called with: ev = [" + ev + "]"); | 
|         return super.onTouchEvent(ev); | 
|     } | 
|   | 
|     //是否在水平滑动 | 
|     private boolean isHorizontalScroll(int x, int y) { | 
|         return Math.abs(y - mLastY) < Math.abs(x - mLastX); | 
|     } | 
|   | 
|     //是否未到达最后一页 | 
|     private boolean isReachLastPage() { | 
|         PagerAdapter adapter = getAdapter(); | 
|         if (null != adapter && adapter.getCount() - 1 == getCurrentItem()) { | 
|             return true; | 
|         } else { | 
|             return false; | 
|         } | 
|     } | 
|   | 
|     //是否在第一页 | 
|     private boolean isReactFirstPage() { | 
|         if (getCurrentItem() == 0) { | 
|             return true; | 
|         } else { | 
|             return false; | 
|         } | 
|     } | 
|   | 
|     //是否左滑 | 
|     private boolean isScrollLeft(int x) { | 
|         return x - mLastX < 0; | 
|     } | 
|   | 
|     private boolean isScrollRight(int x) { | 
|         return x - mLastX > 0; | 
|     } | 
| } |