1346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/* 2346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Copyright (C) 2012 The Android Open Source Project 3346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 4346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * you may not use this file except in compliance with the License. 6346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * You may obtain a copy of the License at 7346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 8346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 10346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Unless required by applicable law or agreed to in writing, software 11346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * See the License for the specific language governing permissions and 14346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * limitations under the License. 15346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 16346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 17346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellpackage android.support.v4.widget; 18346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 19346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.content.Context; 20b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powellimport android.os.Build; 21c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powellimport android.view.animation.Interpolator; 22346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.widget.Scroller; 23346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 24346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/** 25346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Provides access to new {@link android.widget.Scroller Scroller} APIs when available. 26346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 27346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * <p>This class provides a platform version-independent mechanism for obeying the 28346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * current device's preferred scroll physics and fling behavior. It offers a subset of 29346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the APIs from Scroller or OverScroller.</p> 30346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 31b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powellpublic class ScrollerCompat { 32b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell Object mScroller; 33346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 34b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell interface ScrollerCompatImpl { 35b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell Object createScroller(Context context, Interpolator interpolator); 36b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean isFinished(Object scroller); 37b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int getCurrX(Object scroller); 38b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int getCurrY(Object scroller); 39b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell float getCurrVelocity(Object scroller); 40b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean computeScrollOffset(Object scroller); 41b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void startScroll(Object scroller, int startX, int startY, int dx, int dy); 42b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void startScroll(Object scroller, int startX, int startY, int dx, int dy, int duration); 43b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void fling(Object scroller, int startX, int startY, int velX, int velY, 44b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY); 45b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void fling(Object scroller, int startX, int startY, int velX, int velY, 46b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY); 47b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void abortAnimation(Object scroller); 48b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, int overX); 49b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY); 50b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean isOverScrolled(Object scroller); 516580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell int getFinalX(Object scroller); 526580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell int getFinalY(Object scroller); 53b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 54b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 55b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplBase implements ScrollerCompatImpl { 56b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 57b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public Object createScroller(Context context, Interpolator interpolator) { 58b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return interpolator != null ? 59b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell new Scroller(context, interpolator) : new Scroller(context); 60b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 61b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 62b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 63b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isFinished(Object scroller) { 64b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).isFinished(); 65b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 66b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 67b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 68b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrX(Object scroller) { 69b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).getCurrX(); 70b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 71b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 72b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 73b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrY(Object scroller) { 74b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).getCurrY(); 75b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 76b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 77b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 78b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 79b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return 0; 80b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 81b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 82b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 83b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean computeScrollOffset(Object scroller) { 84b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).computeScrollOffset(); 85b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 86b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 87b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 88b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy) { 89b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).startScroll(startX, startY, dx, dy); 90b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 91b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 92b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 93b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy, 94b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int duration) { 95b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).startScroll(startX, startY, dx, dy, duration); 96b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 97b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 98b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 99b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 100b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY) { 101b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY); 102b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 103b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 104b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 105b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 106b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 107b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY); 108b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 109b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 110b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 111b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void abortAnimation(Object scroller) { 112b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).abortAnimation(); 113b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 114b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 115b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 116b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, 117b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int overX) { 118b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // No-op 119b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 120b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 121b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 122b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) { 123b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // No-op 124b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 125b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 126b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 127b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled(Object scroller) { 128b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // Always false 129b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return false; 130b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 1316580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 1326580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 1336580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX(Object scroller) { 1346580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ((Scroller) scroller).getFinalX(); 1356580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 1366580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 1376580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 1386580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY(Object scroller) { 1396580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ((Scroller) scroller).getFinalY(); 1406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 141b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 142b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 143b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplGingerbread implements ScrollerCompatImpl { 144b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 145b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public Object createScroller(Context context, Interpolator interpolator) { 146b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.createScroller(context, interpolator); 147b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 148b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 149b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 150b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isFinished(Object scroller) { 151b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.isFinished(scroller); 152b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 153b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 154b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 155b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrX(Object scroller) { 156b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.getCurrX(scroller); 157b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 158b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 159b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 160b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrY(Object scroller) { 161b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.getCurrY(scroller); 162b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 163b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 164b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 165b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 166b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return 0; 167b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 168b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 169b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 170b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean computeScrollOffset(Object scroller) { 171b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.computeScrollOffset(scroller); 172b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 173b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 174b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 175b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy) { 176b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy); 177b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 178b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 179b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 180b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy, 181b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int duration) { 182b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy, duration); 183346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 184346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 185346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell @Override 186b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 187b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY) { 188b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY, 189b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY); 190b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 191b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 192b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 193b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 194b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 195b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY, 196b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY, overX, overY); 197b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 198b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 199b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 200b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void abortAnimation(Object scroller) { 201b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.abortAnimation(scroller); 202b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 203b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 204b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 205b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, 206b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int overX) { 207b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.notifyHorizontalEdgeReached(scroller, startX, finalX, overX); 208b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 209b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 210b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 211b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) { 212b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.notifyVerticalEdgeReached(scroller, startY, finalY, overY); 213b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 214b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 215b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 216b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled(Object scroller) { 217b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.isOverScrolled(scroller); 218b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 2196580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 2206580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 2216580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX(Object scroller) { 2226580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ScrollerCompatGingerbread.getFinalX(scroller); 2236580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 2246580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 2256580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 2266580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY(Object scroller) { 2276580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ScrollerCompatGingerbread.getFinalY(scroller); 2286580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 229b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 230b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 231b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplIcs extends ScrollerCompatImplGingerbread { 232b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 233b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 234b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatIcs.getCurrVelocity(scroller); 235b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 236b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 237b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 238b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static final ScrollerCompatImpl IMPL; 239b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static { 240b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell final int version = Build.VERSION.SDK_INT; 241b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell if (version >= 14) { // ICS 242b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL = new ScrollerCompatImplIcs(); 243b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } else if (version >= 9) { // Gingerbread 244b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL = new ScrollerCompatImplGingerbread(); 245b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } else { 246b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL = new ScrollerCompatImplBase(); 247346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 248346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 249346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 250c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell public static ScrollerCompat create(Context context) { 251c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell return create(context, null); 252c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell } 253c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell 254c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell public static ScrollerCompat create(Context context, Interpolator interpolator) { 255c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell return new ScrollerCompat(context, interpolator); 256346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 257346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 258c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell ScrollerCompat(Context context, Interpolator interpolator) { 259b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell mScroller = IMPL.createScroller(context, interpolator); 260346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 261346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 262346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 263346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns whether the scroller has finished scrolling. 264346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 265346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return True if the scroller has finished scrolling, false otherwise. 266346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 267346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public boolean isFinished() { 268b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.isFinished(mScroller); 269346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 270346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 271346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 272346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns the current X offset in the scroll. 273346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 274346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The new X offset as an absolute distance from the origin. 275346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 276346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public int getCurrX() { 277b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.getCurrX(mScroller); 278346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 279346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 280346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 281346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns the current Y offset in the scroll. 282346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 283346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The new Y offset as an absolute distance from the origin. 284346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 285346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public int getCurrY() { 286b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.getCurrY(mScroller); 287346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 288346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 289346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 2906580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell * @return The final X position for the scroll in progress, if known. 2916580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell */ 2926580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX() { 2936580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return IMPL.getFinalX(mScroller); 2946580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 2956580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 2966580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell /** 2976580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell * @return The final Y position for the scroll in progress, if known. 2986580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell */ 2996580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY() { 3006580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return IMPL.getFinalY(mScroller); 3016580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 3026580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 3036580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell /** 304b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Returns the current velocity on platform versions that support it. 305346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 306b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * <p>The device must support at least API level 14 (Ice Cream Sandwich). 307b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * On older platform versions this method will return 0. This method should 308b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p> 309346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 310346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The original velocity less the deceleration. Result may be 311346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * negative. 312346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 313346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public float getCurrVelocity() { 314b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.getCurrVelocity(mScroller); 315346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 316346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 317346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 318346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Call this when you want to know the new location. If it returns true, 319346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the animation is not yet finished. loc will be altered to provide the 320346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * new location. 321346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 322346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public boolean computeScrollOffset() { 323b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.computeScrollOffset(mScroller); 324346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 325346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 326346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 327346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling by providing a starting point and the distance to travel. 328346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * The scroll will use the default value of 250 milliseconds for the 329346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * duration. 330346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 331346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting horizontal scroll offset in pixels. Positive 332346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * numbers will scroll the content to the left. 333346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting vertical scroll offset in pixels. Positive numbers 334346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * will scroll the content up. 335346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dx Horizontal distance to travel. Positive numbers will scroll the 336346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content to the left. 337346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dy Vertical distance to travel. Positive numbers will scroll the 338346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content up. 339346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 340346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void startScroll(int startX, int startY, int dx, int dy) { 341b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.startScroll(mScroller, startX, startY, dx, dy); 342346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 343346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 344346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 345346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling by providing a starting point and the distance to travel. 346346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 347346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting horizontal scroll offset in pixels. Positive 348346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * numbers will scroll the content to the left. 349346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting vertical scroll offset in pixels. Positive numbers 350346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * will scroll the content up. 351346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dx Horizontal distance to travel. Positive numbers will scroll the 352346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content to the left. 353346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dy Vertical distance to travel. Positive numbers will scroll the 354346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content up. 355346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param duration Duration of the scroll in milliseconds. 356346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 357346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void startScroll(int startX, int startY, int dx, int dy, int duration) { 358b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.startScroll(mScroller, startX, startY, dx, dy, duration); 359346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 360346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 361346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 362346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling based on a fling gesture. The distance travelled will 363346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * depend on the initial velocity of the fling. 364346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 365346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting point of the scroll (X) 366346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting point of the scroll (Y) 367346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param velocityX Initial velocity of the fling (X) measured in pixels per 368346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * second. 369346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param velocityY Initial velocity of the fling (Y) measured in pixels per 370346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * second 371346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param minX Minimum X value. The scroller will not scroll past this 372346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 373346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param maxX Maximum X value. The scroller will not scroll past this 374346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 375346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param minY Minimum Y value. The scroller will not scroll past this 376346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 377346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param maxY Maximum Y value. The scroller will not scroll past this 378346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 379346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 380346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void fling(int startX, int startY, int velocityX, int velocityY, 381346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell int minX, int maxX, int minY, int maxY) { 382b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.fling(mScroller, startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); 383346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 384346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 385346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 386b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Start scrolling based on a fling gesture. The distance travelled will 387b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * depend on the initial velocity of the fling. 388b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 389b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startX Starting point of the scroll (X) 390b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startY Starting point of the scroll (Y) 391b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param velocityX Initial velocity of the fling (X) measured in pixels per 392b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * second. 393b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param velocityY Initial velocity of the fling (Y) measured in pixels per 394b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * second 395b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param minX Minimum X value. The scroller will not scroll past this 396b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 397b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param maxX Maximum X value. The scroller will not scroll past this 398b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 399b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param minY Minimum Y value. The scroller will not scroll past this 400b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 401b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param maxY Maximum Y value. The scroller will not scroll past this 402b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 403b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overX Overfling range. If > 0, horizontal overfling in either 404b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * direction will be possible. 405b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overY Overfling range. If > 0, vertical overfling in either 406b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * direction will be possible. 407b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 408b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(int startX, int startY, int velocityX, int velocityY, 409b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 410b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.fling(mScroller, startX, startY, velocityX, velocityY, 411b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY, overX, overY); 412b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 413b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 414b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 415b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Stops the animation. Aborting the animation causes the scroller to move to the final x and y 416b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * position. 417346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 418346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void abortAnimation() { 419b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.abortAnimation(mScroller); 420b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 421b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 422b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 423b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 424b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Notify the scroller that we've reached a horizontal boundary. 425b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Normally the information to handle this will already be known 426b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * when the animation is started, such as in a call to one of the 427b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * fling functions. However there are cases where this cannot be known 428b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * in advance. This function will transition the current motion and 429b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * animate from startX to finalX as appropriate. 430b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 431b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startX Starting/current X position 432b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param finalX Desired final X position 433b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overX Magnitude of overscroll allowed. This should be the maximum 434b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * desired distance from finalX. Absolute value - must be positive. 435b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 436b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { 437b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.notifyHorizontalEdgeReached(mScroller, startX, finalX, overX); 438b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 439b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 440b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 441b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Notify the scroller that we've reached a vertical boundary. 442b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Normally the information to handle this will already be known 443b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * when the animation is started, such as in a call to one of the 444b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * fling functions. However there are cases where this cannot be known 445b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * in advance. This function will animate a parabolic motion from 446b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * startY to finalY. 447b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 448b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startY Starting/current Y position 449b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param finalY Desired final Y position 450b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overY Magnitude of overscroll allowed. This should be the maximum 451b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * desired distance from finalY. Absolute value - must be positive. 452b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 453b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { 454b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell IMPL.notifyVerticalEdgeReached(mScroller, startY, finalY, overY); 455b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 456b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 457b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 458b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Returns whether the current Scroller is currently returning to a valid position. 459b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Valid bounds were provided by the 460b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. 461b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 462b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * One should check this value before calling 463b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress 464b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * to restore a valid position will then be stopped. The caller has to take into account 465b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * the fact that the started scroll will start from an overscrolled position. 466b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 467b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @return true when the current position is overscrolled and in the process of 468b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * interpolating back to a valid value. 469b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 470b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled() { 471b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return IMPL.isOverScrolled(mScroller); 472346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 473346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell} 474