老套路先上效果圖:
可以在臨界點滑動的ViewPager,上圖效果是;兩個ViewPager,一個垂直一個水平滑動的,這次主要講解臨界點左右滑動,實際上很簡單,只需要自定義ViewPager在事件分發中的分發事件中獲取按下的座標,然後在onTouch事件中的UP(擡起)事件中做相應的判斷,記住一定要在擡起事件,不能在移動事件中,否則會調用多次。具體看代碼:
package com.tm.live.ui.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* @author xiayiye5
* 說明:監聽在臨界邊界還繼續左滑右滑監聽的ViewPager
*/
public class LeftRightViewPager 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 LeftRightViewPager(Context context) {
this(context, null);
}
public LeftRightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startX = (int) event.getX();
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//此處一定要是UP事件,Move事件會調用三次(多次)
if (event.getAction() == MotionEvent.ACTION_UP) {
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();
}
}
}
return super.onTouchEvent(event);
}
}
看下這個自定義的ViewPager的臨界點左右滑動的監聽方法:
ViewPager.setOnSideListener(object : LeftRightViewPager.OnSideListener {
override fun onLeftSide() {
println("左邊滑動了")
}
override fun onRightSide() {
println("右邊滑動了")
}
}
})
再次感謝原博主:鏈接地址