浅谈布局中ViewPager嵌套ViewPager问题

在开发布局中,从功能性,用户体验等方面设计时,会出现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;  
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值