view 能够正常的吃掉点击事件, 但是如果是滑动事件时, 则是父View 来处理来滑动另一个View
基本原理就是
在View group中得onInterceptTouchEvent 方法中判断是否是滑动,
如果是滑动,那么就返回true 自身去消费滑动事件,
还需要注意的是, 在处理滑动事件的时候需要注意 两个手指滑动的情况
即 另一个手指按下也能够继续滑动,
import android.content.Context; import android.support.annotation.Nullable; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.VelocityTrackerCompat; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import com.basjoo.basjoolive.utils.LogUtil; /** * Created by myf on 2017/9/29. */ public class NoslideRecyclerview extends RecyclerView{ /** * 只处理 纵向滑动事件, 其他事件不做 处理 * 适用于只接受点击事件 滑动事件交给父控件处理的地方(垂直) */ public NoslideRecyclerview(Context context) { super(context); init(); } public NoslideRecyclerview(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public NoslideRecyclerview(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public static final String TAG = "CustomScrollViewGroup"; private static final int MIN_DISTANCE_FOR_FLING = 25; // dips private OnScrollListener mOnScrollListener; private int mTouchSlop; protected VelocityTracker mVelocityTracker; private int mMinimumVelocity; private int mMaximumVelocity; /** * Position of the last motion event. */ private float mLastMotionX; private float mLastMotionY; private float mInitialMotionY, mInitialMotionX; protected int mActivePointerId = INVALID_POINTER; private static final int INVALID_POINTER = -1; private boolean mIsUnableToDrag = false; private int mFlingDistance; private boolean mIsBeingDragged = false; boolean mScrollToEnd =