2013-09-05 3 views
0

У меня есть расширенный класс ViewPager, и я использую onPageScrolled для захвата смещения.Android ViewPager Scrolling

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

ответ

0

Вам нужно написать собственный скроллер, где вы можете изменить его продолжительность прокрутки ...

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)