Recyclerview嵌套viewpager屯阀,手指按在viewpager上向上滑動無效(首頁banner輪播)。
繼承ViewPager重寫onTouchEvent()方法轴术,對viewpager進行分發(fā)處理难衰。
首先獲取手指觸摸位置
判斷viewpager的滑動方向,
if是上下滑動交給父布局處理
if左右滑動攔截下來自己處理
PointF downP = new PointF();
PointF curP = new PointF();
private float xDown;// 記錄手指按下時的橫坐標逗栽。
private float xMove;// 記錄手指移動時的橫坐標盖袭。
private float yDown;// 記錄手指按下時的縱坐標。
@Override
public boolean onTouchEvent(MotionEvent ev) {
// 每次進行onTouch事件都記錄當前的按下的坐標
curP.x = ev.getX();
curP.y = ev.getY();
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
downP.x = ev.getX();
downP.y = ev.getY();
xDown = ev.getX();
yDown = ev.getY();
// 此句代碼是為了通知他的父ViewPager現(xiàn)在進行的是本控件的操作彼宠,不要對我的操作進行干擾
getParent().requestDisallowInterceptTouchEvent(true);
}
//移動的時候進行判斷
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
xMove = ev.getX();
float yMove = ev.getY();
// 這里判斷是橫向還是縱向移動鳄虱,
if (Math.abs(yMove - yDown) < Math.abs(xMove - xDown) && Math.abs(xMove - xDown) > 2) {
// 橫向滑動的處理
if (Math.abs(xMove - xDown) > 2) {
// 左右滑動的時候進行攔截,自己處理
getParent().requestDisallowInterceptTouchEvent(true);
} else {
// 自己進行處理凭峡,不在上傳給父布局
return false;
}
} else {
// 父布局進行事件攔截
getParent().requestDisallowInterceptTouchEvent(false);
}
}
return super.onTouchEvent(ev);
}