最近項目比較忙,一個項目接着一個項目,遇到的問題也不少,其中有一個需求是要實現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() {
// 右邊界滑動時處理
...
}
});