/* * Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package android.support.v4.widget; import android.content.Context; import android.os.Build; import android.view.animation.Interpolator; import android.widget.Scroller; public class FriendlyScrollerCompat { ScrollerCompat mScrollerCompat; FriendlyScrollerCompatImpl mImpl; interface FriendlyScrollerCompatImpl { int getStartX(Object scroller); int getStartY(Object scroller); void forceFinished(Object scroller, boolean finished); } static class FriendlyScrollerCompatImplBase implements FriendlyScrollerCompatImpl { @Override public int getStartX(Object scroller) { return ((Scroller) scroller).getStartX(); } @Override public int getStartY(Object scroller) { return ((Scroller) scroller).getStartY(); } @Override public void forceFinished(Object scroller, boolean finished) { ((Scroller) scroller).forceFinished(finished); } } static class FriendlyScrollerCompatImplGingerbread implements FriendlyScrollerCompatImpl { @Override public int getStartX(Object scroller) { return FriendlyScrollerCompatGingerbread.getStartX(scroller); } @Override public int getStartY(Object scroller) { return FriendlyScrollerCompatGingerbread.getStartY(scroller); } @Override public void forceFinished(Object scroller, boolean finished) { FriendlyScrollerCompatGingerbread.forceFinished(scroller, finished); } } public static FriendlyScrollerCompat create(Context context) { return create(context, null); } public static FriendlyScrollerCompat create(Context context, Interpolator interpolator) { return new FriendlyScrollerCompat(context, interpolator); } FriendlyScrollerCompat(Context context, Interpolator interpolator) { mScrollerCompat = ScrollerCompat.create(context, interpolator); if (Build.VERSION.SDK_INT >= 9) { // Gingerbread mImpl = new FriendlyScrollerCompatImplGingerbread(); } else { mImpl = new FriendlyScrollerCompatImplBase(); } } /** * Returns the start X offset in the scroll. * * @return The start X offset as an absolute distance from the origin. */ public final int getStartX() { return mImpl.getStartX(mScrollerCompat.mScroller); } /** * Returns the start Y offset in the scroll. * * @return The start Y offset as an absolute distance from the origin. */ public final int getStartY() { return mImpl.getStartY(mScrollerCompat.mScroller); } /** * Force the finished field to a particular value. * * @param finished The new finished value. */ public void forceFinished(boolean finished) { mImpl.forceFinished(mScrollerCompat.mScroller, finished); } public boolean isFinished() { return mScrollerCompat.isFinished(); } public int getCurrX() { return mScrollerCompat.getCurrX(); } public int getCurrY() { return mScrollerCompat.getCurrY(); } public int getFinalX() { return mScrollerCompat.getFinalX(); } public int getFinalY() { return mScrollerCompat.getFinalY(); } public float getCurrVelocity() { return mScrollerCompat.getCurrVelocity(); } public boolean computeScrollOffset() { return mScrollerCompat.computeScrollOffset(); } public void startScroll(int startX, int startY, int dx, int dy) { mScrollerCompat.startScroll(startX, startY, dx, dy); } public void startScroll(int startX, int startY, int dx, int dy, int duration) { mScrollerCompat.startScroll(startX, startY, dx, dy, duration); } public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) { mScrollerCompat.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); } public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY, int overX, int overY) { mScrollerCompat.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, overX, overY); } public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) { return mScrollerCompat.springBack(startX, startY, minX, maxX, minY, maxY); } public void abortAnimation() { mScrollerCompat.abortAnimation(); } public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { mScrollerCompat.notifyVerticalEdgeReached(startY, finalY, overY); } public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { mScrollerCompat.notifyHorizontalEdgeReached(startX, finalX, overX); } public boolean isOverScrolled() { return mScrollerCompat.isOverScrolled(); } }