ViewPager與OnPageChangeListener

1.onPageSelectedonPageScrollStateChanged

  • 正常的滑動:
    手指滑動一段距離離開屏幕,ViewPager自動將當前選中頁面滑動到位
    state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
    state:ViewPager.SCROLL_STATE_SETTLING//手指離開屏幕
    onPageSelected//選中
    state:ViewPager.SCROLL_STATE_IDLE//停止滑動

  • 不正常的滑動:
    手指一直按住屏幕把選中頁面滑動到位,然后手指離開屏幕
    state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
    state:ViewPager.SCROLL_STATE_IDLE//停止滑動
    onPageSelected//選中

2.onPageSelected、onPageScrollStateChangedonPageScrolled

  • 正常的滑動:
    手指滑動一段距離離開屏幕,ViewPager自動將當前選中頁面滑動到位
    state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
    onPageScrolled//手指觸屏滾動中
    ...
    onPageScrolled//手指觸屏滾動中
    state:ViewPager.SCROLL_STATE_SETTLING//手指離開屏幕
    onPageSelected//選中
    onPageScrolled//自動滾動中
    ...
    onPageScrolled//自動滾動中
    state:ViewPager.SCROLL_STATE_IDLE//停止滑動

  • 不正常的滑動:
    手指一直按住屏幕把選中頁面滑動到位,然后手指離開屏幕
    state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
    onPageScrolled//手指觸屏滾動中
    ...
    onPageScrolled//手指觸屏滾動中
    state:ViewPager.SCROLL_STATE_IDLE//停止滑動
    onPageSelected//選中

  • 從以上可以看到,正常的滑動時在手指離開屏幕時ViewPager觸發(fā)SCROLL_STATE_SETTLING,并執(zhí)行onPageSelected,然后繼續(xù)自動滾動直到停止;不正常的滑動,手指離開屏幕時沒有觸發(fā)SCROLL_STATE_SETTLING 狀態(tài)變化,而是觸發(fā)了SCROLL_STATE_IDLE,也就是屏幕停止滑動后執(zhí)行的onPageSelected,這之后,沒有onPageScrolled執(zhí)行。 因此在如果要在onPageScrolled中正確獲取onPageSelected(position)方法中的currentPosition的話,可以在onPageSelected(position)中判斷滾動狀態(tài),如果仍在滾動中,則執(zhí)行一次onPageScrolled。

實例代碼
    private boolean isDragging = false;
    @Override
    public void onPageScrollStateChanged(int state) {
        switch (state) {
            case ViewPager.SCROLL_STATE_IDLE://停止
                break;
            case ViewPager.SCROLL_STATE_DRAGGING://down
                isDragging = true;
                break;
            case ViewPager.SCROLL_STATE_SETTLING://up
                isDragging = false;
                break;
        }
    }

    int currentPosition;

    @Override
    public void onPageSelected(int position) {
        currentPosition = position;
        if (isDragging) {
            isDragging = false;
            onPageScrolled(position, 0, 0);
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if(!isDragging) {
              Log.i(TAG, "onPageScrolled: :" +currentPosition);
        }
    }

onPageScrolled(int position, float positionOffset, int positionOffsetPixels)

三個參數(shù):
position:是滑出與滑入的2個pager中的左側一個!
positionOffset:偏移量,比例
positionOffsetPixels:偏移量,像素
滑動時,如果是向右,例如1—>2,則偏移量漸漸變大;如果是向左滑動,例如2—>1,則偏移量漸漸變小

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容