ScrollerCompat.java revision c5847d13e40f5d52459f5c0dab32dc08f1a9a683
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; 21009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powellimport android.view.animation.AnimationUtils; 22c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powellimport android.view.animation.Interpolator; 23346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powellimport android.widget.Scroller; 24346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 25346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell/** 26346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Provides access to new {@link android.widget.Scroller Scroller} APIs when available. 27346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 28346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * <p>This class provides a platform version-independent mechanism for obeying the 29346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * current device's preferred scroll physics and fling behavior. It offers a subset of 30346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the APIs from Scroller or OverScroller.</p> 31346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 32c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class ScrollerCompat { 33009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell private static final String TAG = "ScrollerCompat"; 34009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell 35b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell Object mScroller; 36009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell ScrollerCompatImpl mImpl; 37346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 38b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell interface ScrollerCompatImpl { 39b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell Object createScroller(Context context, Interpolator interpolator); 40b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean isFinished(Object scroller); 41b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int getCurrX(Object scroller); 42b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int getCurrY(Object scroller); 43b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell float getCurrVelocity(Object scroller); 44b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean computeScrollOffset(Object scroller); 45b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void startScroll(Object scroller, int startX, int startY, int dx, int dy); 46b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void startScroll(Object scroller, int startX, int startY, int dx, int dy, int duration); 47b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void fling(Object scroller, int startX, int startY, int velX, int velY, 48b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY); 49b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void fling(Object scroller, int startX, int startY, int velX, int velY, 50b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY); 51b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void abortAnimation(Object scroller); 52b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, int overX); 53b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY); 54b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell boolean isOverScrolled(Object scroller); 556580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell int getFinalX(Object scroller); 566580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell int getFinalY(Object scroller); 5700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes boolean springBack(Object scroller, int startX, int startY, int minX, int maxX, 5800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes int minY, int maxY); 59b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 60b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 61009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell static final int CHASE_FRAME_TIME = 16; // ms per target frame 62009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell 63b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplBase implements ScrollerCompatImpl { 64b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 65b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public Object createScroller(Context context, Interpolator interpolator) { 66b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return interpolator != null ? 67b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell new Scroller(context, interpolator) : new Scroller(context); 68b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 69b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 70b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 71b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isFinished(Object scroller) { 7248e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar return ((Scroller) scroller).isFinished(); 73b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 74b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 75b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 76b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrX(Object scroller) { 77b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).getCurrX(); 78b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 79b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 80b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 81b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrY(Object scroller) { 82b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ((Scroller) scroller).getCurrY(); 83b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 84b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 85b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 86b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 87b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return 0; 88b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 89b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 90b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 91b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean computeScrollOffset(Object scroller) { 92009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell final Scroller s = (Scroller) scroller; 9348e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar return s.computeScrollOffset(); 94b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 95b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 96b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 97b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy) { 98b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).startScroll(startX, startY, dx, dy); 99b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 100b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 101b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 102b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy, 103b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int duration) { 104b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).startScroll(startX, startY, dx, dy, duration); 105b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 106b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 107b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 108b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 109b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY) { 110b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY); 111b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 112b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 113b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 114b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 115b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 116b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY); 117b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 118b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 119b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 120b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void abortAnimation(Object scroller) { 121b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ((Scroller) scroller).abortAnimation(); 122b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 123b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 124b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 125b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, 126b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int overX) { 127b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // No-op 128b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 129b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 130b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 131b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) { 132b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // No-op 133b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 134b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 135b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 136b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled(Object scroller) { 137b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell // Always false 138b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return false; 139b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 1406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 1416580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 1426580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX(Object scroller) { 1436580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ((Scroller) scroller).getFinalX(); 1446580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 1456580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 1466580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 1476580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY(Object scroller) { 1486580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ((Scroller) scroller).getFinalY(); 1496580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 15000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes 15100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes @Override 15200db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX, 15300db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes int minY, int maxY) { 15400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes return false; 15500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes } 156b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 157b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 158b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplGingerbread implements ScrollerCompatImpl { 159b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 160b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public Object createScroller(Context context, Interpolator interpolator) { 161b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.createScroller(context, interpolator); 162b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 163b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 164b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 165b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isFinished(Object scroller) { 16648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar return ScrollerCompatGingerbread.isFinished(scroller); 167b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 168b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 169b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 170b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrX(Object scroller) { 171b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.getCurrX(scroller); 172b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 173b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 174b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 175b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public int getCurrY(Object scroller) { 176b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.getCurrY(scroller); 177b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 178b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 179b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 180b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 181b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return 0; 182b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 183b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 184b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 185b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean computeScrollOffset(Object scroller) { 18648e3efd2e7bc8057212d3936a239838ecf6e40a9Yigit Boyar return ScrollerCompatGingerbread.computeScrollOffset(scroller); 187b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 188b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 189b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 190b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy) { 191b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy); 192b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 193b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 194b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 195b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void startScroll(Object scroller, int startX, int startY, int dx, int dy, 196b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int duration) { 197b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy, duration); 198346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 199346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 200346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell @Override 201b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 202b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY) { 203b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY, 204b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY); 205b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 206b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 207b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 208b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(Object scroller, int startX, int startY, int velX, int velY, 209b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 210b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY, 211b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY, overX, overY); 212b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 213b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 214b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 215b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void abortAnimation(Object scroller) { 216b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.abortAnimation(scroller); 217b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 218b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 219b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 220b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, 221b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int overX) { 222b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.notifyHorizontalEdgeReached(scroller, startX, finalX, overX); 223b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 224b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 225b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 226b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) { 227b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell ScrollerCompatGingerbread.notifyVerticalEdgeReached(scroller, startY, finalY, overY); 228b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 229b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 230b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 231b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled(Object scroller) { 232b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatGingerbread.isOverScrolled(scroller); 233b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 2346580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 2356580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 2366580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX(Object scroller) { 2376580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ScrollerCompatGingerbread.getFinalX(scroller); 2386580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 2396580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 2406580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell @Override 2416580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY(Object scroller) { 2426580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell return ScrollerCompatGingerbread.getFinalY(scroller); 2436580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 24400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes 24500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes @Override 24600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX, 24700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes int minY, int maxY) { 24800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes return ScrollerCompatGingerbread.springBack(scroller, startX, startY, minX, maxX, 24900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes minY, maxY); 25000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes } 251b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 252b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 253b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell static class ScrollerCompatImplIcs extends ScrollerCompatImplGingerbread { 254b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell @Override 255b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public float getCurrVelocity(Object scroller) { 256b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell return ScrollerCompatIcs.getCurrVelocity(scroller); 257b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 258b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 259b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 260c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell public static ScrollerCompat create(Context context) { 261c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell return create(context, null); 262c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell } 263c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell 264c56ba65d20be8742ff717907a3a2cd81dd0e5f3cAdam Powell public static ScrollerCompat create(Context context, Interpolator interpolator) { 265c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes return new ScrollerCompat(Build.VERSION.SDK_INT, context, interpolator); 2664ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar } 2674ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar 2684ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar /** 2694ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * Private constructer where API version can be provided. 2704ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar * Useful for unit testing. 2714ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar */ 2724ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar private ScrollerCompat(int apiVersion, Context context, Interpolator interpolator) { 2734ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar if (apiVersion >= 14) { // ICS 274009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl = new ScrollerCompatImplIcs(); 2754ad0efc06631e6e35d8ced424c36438bf5827569Yigit Boyar } else if (apiVersion>= 9) { // Gingerbread 276009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl = new ScrollerCompatImplGingerbread(); 277009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell } else { 278009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl = new ScrollerCompatImplBase(); 279009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell } 280009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mScroller = mImpl.createScroller(context, interpolator); 281346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 282346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 283346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 284346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns whether the scroller has finished scrolling. 285346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 286346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return True if the scroller has finished scrolling, false otherwise. 287346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 288346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public boolean isFinished() { 289009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.isFinished(mScroller); 290346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 291346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 292346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 293346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns the current X offset in the scroll. 294346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 295346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The new X offset as an absolute distance from the origin. 296346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 297346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public int getCurrX() { 298009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.getCurrX(mScroller); 299346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 300346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 301346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 302346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Returns the current Y offset in the scroll. 303346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 304346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The new Y offset as an absolute distance from the origin. 305346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 306346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public int getCurrY() { 307009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.getCurrY(mScroller); 308346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 309346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 310346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 3116580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell * @return The final X position for the scroll in progress, if known. 3126580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell */ 3136580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalX() { 314009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.getFinalX(mScroller); 3156580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 3166580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 3176580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell /** 3186580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell * @return The final Y position for the scroll in progress, if known. 3196580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell */ 3206580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell public int getFinalY() { 321009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.getFinalY(mScroller); 3226580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell } 3236580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell 3246580cf4b7e74a2a017ed95b0dc50155b9995edebAdam Powell /** 325b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Returns the current velocity on platform versions that support it. 326346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 327b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * <p>The device must support at least API level 14 (Ice Cream Sandwich). 328b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * On older platform versions this method will return 0. This method should 329b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p> 330346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 331346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @return The original velocity less the deceleration. Result may be 332346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * negative. 333346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 334346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public float getCurrVelocity() { 335009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.getCurrVelocity(mScroller); 336346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 337346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 338346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 339346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Call this when you want to know the new location. If it returns true, 340346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * the animation is not yet finished. loc will be altered to provide the 341346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * new location. 342346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 343346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public boolean computeScrollOffset() { 344009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.computeScrollOffset(mScroller); 345346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 346346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 347346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 348346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling by providing a starting point and the distance to travel. 349346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * The scroll will use the default value of 250 milliseconds for the 350346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * duration. 351346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 352346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting horizontal scroll offset in pixels. Positive 353346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * numbers will scroll the content to the left. 354346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting vertical scroll offset in pixels. Positive numbers 355346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * will scroll the content up. 356346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dx Horizontal distance to travel. Positive numbers will scroll the 357346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content to the left. 358346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dy Vertical distance to travel. Positive numbers will scroll the 359346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content up. 360346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 361346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void startScroll(int startX, int startY, int dx, int dy) { 362009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.startScroll(mScroller, startX, startY, dx, dy); 363346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 364346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 365346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 366346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling by providing a starting point and the distance to travel. 367346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 368346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting horizontal scroll offset in pixels. Positive 369346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * numbers will scroll the content to the left. 370346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting vertical scroll offset in pixels. Positive numbers 371346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * will scroll the content up. 372346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dx Horizontal distance to travel. Positive numbers will scroll the 373346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content to the left. 374346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param dy Vertical distance to travel. Positive numbers will scroll the 375346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * content up. 376346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param duration Duration of the scroll in milliseconds. 377346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 378346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void startScroll(int startX, int startY, int dx, int dy, int duration) { 379009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.startScroll(mScroller, startX, startY, dx, dy, duration); 380346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 381346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 382346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 383346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * Start scrolling based on a fling gesture. The distance travelled will 384346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * depend on the initial velocity of the fling. 385346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * 386346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startX Starting point of the scroll (X) 387346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param startY Starting point of the scroll (Y) 388346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param velocityX Initial velocity of the fling (X) measured in pixels per 389346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * second. 390346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param velocityY Initial velocity of the fling (Y) measured in pixels per 391346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * second 392346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param minX Minimum X value. The scroller will not scroll past this 393346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 394346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param maxX Maximum X value. The scroller will not scroll past this 395346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 396346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param minY Minimum Y value. The scroller will not scroll past this 397346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 398346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * @param maxY Maximum Y value. The scroller will not scroll past this 399346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell * point. 400346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 401346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void fling(int startX, int startY, int velocityX, int velocityY, 402346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell int minX, int maxX, int minY, int maxY) { 403009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.fling(mScroller, startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); 404346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 405346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell 406346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell /** 407b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Start scrolling based on a fling gesture. The distance travelled will 408b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * depend on the initial velocity of the fling. 409b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 410b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startX Starting point of the scroll (X) 411b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startY Starting point of the scroll (Y) 412b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param velocityX Initial velocity of the fling (X) measured in pixels per 413b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * second. 414b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param velocityY Initial velocity of the fling (Y) measured in pixels per 415b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * second 416b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param minX Minimum X value. The scroller will not scroll past this 417b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 418b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param maxX Maximum X value. The scroller will not scroll past this 419b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 420b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param minY Minimum Y value. The scroller will not scroll past this 421b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 422b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param maxY Maximum Y value. The scroller will not scroll past this 423b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * point. 424b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overX Overfling range. If > 0, horizontal overfling in either 425b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * direction will be possible. 426b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overY Overfling range. If > 0, vertical overfling in either 427b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * direction will be possible. 428b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 429b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void fling(int startX, int startY, int velocityX, int velocityY, 430b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell int minX, int maxX, int minY, int maxY, int overX, int overY) { 431009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.fling(mScroller, startX, startY, velocityX, velocityY, 432b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell minX, maxX, minY, maxY, overX, overY); 433b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 434b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 435b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 43600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * Call this when you want to 'spring back' into a valid coordinate range. 43700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * 43800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @param startX Starting X coordinate 43900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @param startY Starting Y coordinate 44000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @param minX Minimum valid X value 44100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @param maxX Maximum valid X value 44200db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @param minY Minimum valid Y value 4438c05e5f52fbc790b745e768398d9e69d6b9d9ee1Chris Banes * @param maxY Maximum valid Y value 44400db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * @return true if a springback was initiated, false if startX and startY were 44500db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes * already within the valid range. 44600db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes */ 44700db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) { 44800db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes return mImpl.springBack(mScroller, startX, startY, minX, maxX, minY, maxY); 44900db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes } 45000db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes 45100db92e217c3bc08acd09143cac8e3d3b0d0e813Chris Banes /** 452b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Stops the animation. Aborting the animation causes the scroller to move to the final x and y 453b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * position. 454346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell */ 455346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell public void abortAnimation() { 456009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.abortAnimation(mScroller); 457b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 458b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 459b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 460b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 461b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Notify the scroller that we've reached a horizontal boundary. 462b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Normally the information to handle this will already be known 463b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * when the animation is started, such as in a call to one of the 464b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * fling functions. However there are cases where this cannot be known 465b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * in advance. This function will transition the current motion and 466b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * animate from startX to finalX as appropriate. 467b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 468b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startX Starting/current X position 469b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param finalX Desired final X position 470b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overX Magnitude of overscroll allowed. This should be the maximum 471b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * desired distance from finalX. Absolute value - must be positive. 472b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 473b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { 474009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.notifyHorizontalEdgeReached(mScroller, startX, finalX, overX); 475b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 476b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 477b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 478b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Notify the scroller that we've reached a vertical boundary. 479b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Normally the information to handle this will already be known 480b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * when the animation is started, such as in a call to one of the 481b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * fling functions. However there are cases where this cannot be known 482b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * in advance. This function will animate a parabolic motion from 483b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * startY to finalY. 484b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 485b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param startY Starting/current Y position 486b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param finalY Desired final Y position 487b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @param overY Magnitude of overscroll allowed. This should be the maximum 488b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * desired distance from finalY. Absolute value - must be positive. 489b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 490b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { 491009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell mImpl.notifyVerticalEdgeReached(mScroller, startY, finalY, overY); 492b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell } 493b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell 494b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell /** 495b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Returns whether the current Scroller is currently returning to a valid position. 496b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * Valid bounds were provided by the 497b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. 498b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 499b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * One should check this value before calling 500b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress 501b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * to restore a valid position will then be stopped. The caller has to take into account 502b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * the fact that the started scroll will start from an overscrolled position. 503b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * 504b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * @return true when the current position is overscrolled and in the process of 505b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell * interpolating back to a valid value. 506b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell */ 507b9e34c7d443082d5ee2b90a0e6788523d8df0df1Adam Powell public boolean isOverScrolled() { 508009b4ef9d97e1cc237477e3284fc305bb1438cc9Adam Powell return mImpl.isOverScrolled(mScroller); 509346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell } 510346e2f2390f0d743fd10e7d01a015df6b32292cdAdam Powell} 511