您的位置:首页 > 其它

ViewPager禁止滑动,设置页片间距,设置当前显示的页面,缓存个数,以及解决嵌套ViewPager左右滑动冲突问题

2017-04-01 14:02 961 查看
使用一个类继承ViewPager,重写onTouchEvent,dispatchTouchEvent方法,皆返回false,禁止滑动

@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;//去掉父类处理事件能力,自己不消费
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return false;//返回false禁止父类分发事件
}


设置页片间距
mViewPager.setPageMargin(45);
//其中数字为像素

设置当前显示的页面
mViewPager.setCurrentItem(1);
//默认索引0开始既是第一个

设置缓存个数mViewPager.setOffscreenPageLimit(3)`;//默认为1,左右各缓存一个

2,因嵌套ViewPager左右滑动问题,可以通过dispatchTouchEvent的方法判断是否是左右滑动,再通过getParent().requestDisallowInterceptTouchEvent请求父容器

public class ChildViewPager extends ViewPager {

private int downX;
private int downY;

public ChildViewPager(Context context) {
super(context);
}

public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
if (action==MotionEvent.ACTION_DOWN){
downX = (int) ev.getX();
downY = (int) ev.getY();
getParent().requestDisallowInterceptTouchEvent( true);
}else if (action==MotionEvent.ACTION_MOVE){
int moveX = (int) ev.getX();
int moveY = (int) ev.getY();
int dx = moveX - downX;
int dY = moveY - downY;
//通过计算滑动的绝对值判断上下还是左右滑动  上下滑动 由父容器处理
if (Math.abs(dx)<Math.abs(dY)){
getParent().requestDisallowInterceptTouchEvent(false);
}else {
//第一页并且手指是从右向左滑动不处理事件
if (getCurrentItem()==0 &&dx>0){
getParent().requestDisallowInterceptTouchEvent(false);
}else if (getCurrentItem()==getAdapter().getCount()-1 &&dx<0){ //最后一页并且手指是从左向右滑动不处理事件
getParent().requestDisallowInterceptTouchEvent(false);
}else {
getParent().requestDisallowInterceptTouchEvent(true);
}
}
}
return super.dispatchTouchEvent(ev);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐