最近项目比较忙,一个项目接着一个项目,遇到的问题也不少,其中有一个需求是要实现ViewPager的两级联动,在ViewPager处于边界的时候,继续滑动,标题要进行切换,大概想了一下不是很复杂,简单的实现一下.
一、需求分析
需要在ViewPager在边界的时候,继续滑动时做出处理,可以通过判断当前是否是边界页面的时候对点击滑动的距离进行记录,来通过滑动的值判断方向从而确定是否是边界滑动,设置一个临界值来判断是否为滑动,最后确认为边界滑动后通过回调来进行后续操作.
二、代码实现
代码不是很复杂,直接贴代码了
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* Created by junweiliu on 16/9/20.
*/
public class SideViewPager extends ViewPager {
/**
* 开始点击的位置
*/
private int startX;
/**
* 临界值
*/
private int criticalValue = 200;
/**
* 边界滑动回调
*/
public interface onSideListener {
/**
* 左边界回调
*/
void onLeftSide();
/**
* 右边界回调
*/
void onRightSide();
}
/**
* 回调
*/
private onSideListener mOnSideListener;
/**
* 设置回调
*
* @param listener
*/
public void setOnSideListener(onSideListener listener) {
this.mOnSideListener = listener;
}
/**
* 设置临界值
*
* @param criticalValue
*/
public void setCriticalValue(int criticalValue) {
this.criticalValue = criticalValue;
}
public SideViewPager(Context context) {
this(context, null);
}
public SideViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) event.getX();
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (startX - event.getX() > criticalValue && (getCurrentItem() == getAdapter().getCount() - 1)) {
if (null != mOnSideListener) {
mOnSideListener.onRightSide();
}
}
if ((event.getX() - startX) > criticalValue && (getCurrentItem() == 0)) {
if (null != mOnSideListener) {
mOnSideListener.onLeftSide();
}
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
}
需要注意的是,获取开始点击的位置时,要在dispatchTouchEvent或者onInterceptTouchEvent中去获取,在onTouchEvent中是获取不到值的,这是因为点击事件分发的原因,有很多关于这方面的文章,有兴趣可以去看一下.
具体使用的话也很简单,实现回调方法即可
mViewPager.setOnSideListener(new SideViewPager.onSideListener() {
@Override
public void onLeftSide() {
// 左边界滑动时处理
...
}
@Override
public void onRightSide() {
// 右边界滑动时处理
...
}
});