簡體   English   中英

Android ViewPager滾動

[英]Android ViewPager Scrolling

我有一個擴展的ViewPager類,並且正在使用onPageScrolled捕獲偏移量。

protected void onPageScrolled(int position, float offset, int offsetPixels)

並使用onTouchEvent來控制視圖滾動

public boolean onTouchEvent(MotionEvent event) {        
    if (this.isPagingEnabled) {
        return super.onTouchEvent(event);
    }

    return false;
}

我需要捕獲偏移量更改,同時禁用viewpager滾動,就好像它正在滾動以顯示使用onDraw自定義滾動效果

您需要編寫自定義Scroller,可以在其中更改滾動持續時間...

package com.finoit.fsop.widgets;

import java.lang.reflect.Field;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Interpolator;

public class CustomViewPager extends ViewPager {

    private ScrollerCustomDuration mScroller = null;

    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
        postInitViewPager();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (this.enabled) {
                return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {

        if (this.enabled) {
                return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    } 

    /**
     * Override the Scroller instance with our own class so we can change the duration
     */
    private void postInitViewPager() {

        try {

                Class<?> viewpager = ViewPager.class;
                Field scroller = viewpager.getDeclaredField("mScroller");
                scroller.setAccessible(true);
                Field interpolator = viewpager.getDeclaredField("sInterpolator");
                interpolator.setAccessible(true);

                mScroller = new ScrollerCustomDuration(getContext(), (Interpolator) interpolator.get(null));
                scroller.set(this, mScroller);

        }
        catch (Exception e) {
        }

    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
            mScroller.setScrollDurationFactor(scrollFactor);
    }


}


package com.finoit.fsop.widgets;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

public class ScrollerCustomDuration extends Scroller {

    private double mScrollFactor = 1;

    public ScrollerCustomDuration(Context context) {
        super(context);
    }

    public ScrollerCustomDuration(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    @SuppressLint("NewApi")
    public ScrollerCustomDuration(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScrollFactor = scrollFactor;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, (int) (duration * mScrollFactor));
    }

}

滾動效果

@Overwrite onPageScrolled(int position, float offset, int offsetPixels)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM