Android開發之可以在臨界點左右滑動的ViewPager

老套路先上效果圖:

 

可以在臨界點滑動的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("右邊滑動了")
                }
            }

        })

再次感謝原博主:鏈接地址

發佈了193 篇原創文章 · 獲贊 107 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章