您的位置:首页 > 其它

浅谈布局中ViewPager嵌套ViewPager问题

2016-06-06 08:58 267 查看
在开发布局中,从功能性,用户体验等方面设计时,会出现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;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: