繁体   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