在开发布局中,从功能性,用户体验等方面设计时,会出现ViewPager中嵌套ViewPager的问题,下面从两方面考虑解决这个问题
一、外层ViewPager不滑动,内层ViewPager滑动
自定义外层viewpager,重写onInterceptTouchEvent方法,代码如下:
public class BaseViewPager extends ViewPager{
private boolean isCanScroll = true;
public BaseViewPager(Context context) {
super(context);
}
public BaseViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollble(boolean scrollble) {
isCanScroll = scrollble;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (isCanScroll) {
return super.onInterceptTouchEvent(event);
} else {
return false;
}
}
}
二、双层ViewPager都能滑动(一般用于加载广告,推荐页面)
自定义内层ViewPager,代码如下:
public class MyViewPager extends ViewPager implements OnGestureListener{
/** 手势滑动处理类 **/
private GestureDetector mDetector;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
GestureDetector detector = new GestureDetector(context, this);
mDetector = detector;
}
public GestureDetector getGestureDetector() {
return mDetector;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(listener != null) {
listener.setOnSimpleClickListenr(getCurrentItem());
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
private onSimpleClickListener listener;
/** 单击监听接口 **/
public interface onSimpleClickListener {
void setOnSimpleClickListenr(int position);
}
public void setOnSimpleClickListener(onSimpleClickListener listener) {
this.listener = listener;
}
}
在fragment中重写ViewPager的OnTouchListener,代码如下:
private float xDistance, yDistance;
/** 记录按下的X坐标 **/
private float mLastMotionX,mLastMotionY;
/** 是否是左右滑动 **/
private boolean mIsBeingDragged = true;
@Override
public boolean onTouch(View v, MotionEvent event) {
vp.getGestureDetector().onTouchEvent(event);
// TODO Auto-generated method stub
final float x = event.getRawX();
final float y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
mLastMotionX = x;
mLastMotionY = y;
case MotionEvent.ACTION_MOVE:
final float xDiff = Math.abs(x - mLastMotionX);
final float yDiff = Math.abs(y - mLastMotionY);
xDistance += xDiff;
yDistance += yDiff;
float dx = xDistance - yDistance;
/** 左右滑动避免和下拉刷新冲突 **/
if (xDistance > yDistance || Math.abs(xDistance - yDistance) < 0.00001f) {
mIsBeingDragged = true;
mLastMotionX = x;
mLastMotionY = y;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);
} else {
mIsBeingDragged = false;
((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
if(mIsBeingDragged) {
((ViewParent) vp.getParent()).requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return false;
}