標籤:
問題描述:
我的嵌套是ViewPager-->ScrollView-->ViewPager.
首先最裡面的ViewPager水平滾動時總是會觸發最外層的ViewPager滾動,看了網上很多的解決辦法基本上是一樣的,需要自訂ViewPager。
import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;/** * 自訂ViewPager,解決ViewPagger嵌套使用時不滑動問題。 * Created by Administrator on 2015/4/20. */public class HorizontalInnerViewPager extends ViewPager { /** 觸摸時按下的點 **/ PointF downP = new PointF(); /** 觸摸時當前的點 **/ PointF curP = new PointF(); public HorizontalInnerViewPager(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(context, new XScrollDetector()); } public HorizontalInnerViewPager(Context context) { super(context); mGestureDetector = new GestureDetector(context, new XScrollDetector()); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev);//default } @Override public boolean onTouchEvent(MotionEvent ev) { //每次進行onTouch事件都記錄當前的按下的座標 curP.x = ev.getX(); curP.y = ev.getY(); if(ev.getAction() == MotionEvent.ACTION_DOWN){ //記錄按下時候的座標 //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變 downP.x = ev.getX(); downP.y = ev.getY(); //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾 getParent().requestDisallowInterceptTouchEvent(true); } if(ev.getAction() == MotionEvent.ACTION_MOVE){ //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾 getParent().requestDisallowInterceptTouchEvent(true); } return super.onTouchEvent(ev); }}
3.解決了上面的問題,又出現了新的問題,當最裡面的ViewPager垂直滾動時外層的ScrollView並不會滾動,解決方案如下:
import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;/** * 自訂ViewPager,解決ViewPagger嵌套使用時不滑動問題。 * Created by Administrator on 2015/4/20. */public class HorizontalInnerViewPager extends ViewPager { /** 觸摸時按下的點 **/ PointF downP = new PointF(); /** 觸摸時當前的點 **/ PointF curP = new PointF(); /** 自訂手勢**/ private GestureDetector mGestureDetector; public HorizontalInnerViewPager(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(context, new XScrollDetector()); } public HorizontalInnerViewPager(Context context) { super(context); mGestureDetector = new GestureDetector(context, new XScrollDetector()); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev);//default //當攔截觸摸事件到達此位置的時候,返回true, //說明將onTouch攔截在此控制項,進而執行此控制項的onTouchEvent// return true; //接近水平滑動時子控制項處理該事件,否則交給父控制項處理// return mGestureDetector.onTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { //每次進行onTouch事件都記錄當前的按下的座標 curP.x = ev.getX(); curP.y = ev.getY(); if(ev.getAction() == MotionEvent.ACTION_DOWN){ //記錄按下時候的座標 //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變 downP.x = ev.getX(); downP.y = ev.getY(); //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾 getParent().requestDisallowInterceptTouchEvent(true); } if(ev.getAction() == MotionEvent.ACTION_MOVE){ float distanceX = curP.x - downP.x; float distanceY = curP.y - downP.y; //接近水平滑動,ViewPager控制項捕獲手勢,水平滾動 if(Math.abs(distanceX) > Math.abs(distanceY)){ //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾 getParent().requestDisallowInterceptTouchEvent(true); }else{ //接近垂直滑動,交給父控制項處理 getParent().requestDisallowInterceptTouchEvent(false); } } return super.onTouchEvent(ev); } private class XScrollDetector extends GestureDetector.SimpleOnGestureListener{ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {// return super.onScroll(e1, e2, distanceX, distanceY); //接近水平滑動時子控制項處理該事件,否則交給父控制項處理 return (Math.abs(distanceX) > Math.abs(distanceY)); } }}
Android ViewPager和ScrollView嵌套滾動問題解決方案