/*
* This file provided by Facebook is for non-commercial testing and evaluation purposes only.
* Facebook reserves all rights not expressly granted.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.rebound.playground.examples.scrollview;
import android.content.Context;
import android.util.Log;
import android.view.animation.Interpolator;
import com.facebook.rebound.Spring;
import com.facebook.rebound.SpringConfig;
import com.facebook.rebound.SpringConfigRegistry;
import com.facebook.rebound.SpringListener;
import com.facebook.rebound.SpringSystem;
public class SpringOverScroller implements SpringListener {
private final SpringSystem mSpringSystem;
private final Spring mSpringX;
private final Spring mSpringY;
private static final SpringConfig COASTING_CONFIG =
SpringConfig.fromOrigamiTensionAndFriction(0, 0.5);
private static final SpringConfig RUBBERBANDING_CONFIG =
SpringConfig.fromOrigamiTensionAndFriction(20, 9);
public SpringOverScroller(Context context) {
this(context, null);
}
public SpringOverScroller(Context context, Interpolator interpolator) {
this(context, interpolator, true);
}
public SpringOverScroller(Context context, Interpolator interpolator,
float bounceCoefficientX, float bounceCoefficientY) {
this(context, interpolator, true);
}
public SpringOverScroller(Context context, Interpolator interpolator,
float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) {
this(context, interpolator, flywheel);
}
public SpringOverScroller(Context context, Interpolator interpolator, boolean flywheel) {
mSpringSystem = SpringSystem.create();
mSpringX = mSpringSystem
.createSpring()
.addListener(this);
mSpringY = mSpringSystem
.createSpring()
.addListener(this);
SpringConfigRegistry
.getInstance()
.addSpringConfig(RUBBERBANDING_CONFIG, "rubber-banding");
SpringConfigRegistry
.getInstance()
.addSpringConfig(COASTING_CONFIG, "coasting");
}
public final void setFriction(float friction) {
}
public final boolean isFinished() {
return mSpringX.isAtRest() && mSpringY.isAtRest();
}
public final int getCurrX() {
return (int) Math.round(mSpringX.getCurrentValue());
}
public final int getCurrY() {
return (int) Math.round(mSpringY.getCurrentValue());
}
public float getCurrVelocity() {
double velX = mSpringX.getVelocity();
double velY = mSpringX.getVelocity();
return (int) Math.sqrt(velX * velX + velY * velY);
}
public final int getStartX() {
return (int) Math.round(mSpringX.getStartValue());
}
public final int getStartY() {
return (int) Math.round(mSpringY.getStartValue());
}
public final int getFinalX() {
return (int) Math.round(mSpringX.getEndValue());
}
public final int getFinalY() {
return (int) Math.round(mSpringY.getEndValue());
}
public boolean computeScrollOffset() {
return !(mSpringX.isAtRest() && mSpringY.isAtRest());
}
public void startScroll(int startX, int startY, int dx, int dy) {
mSpringX.setCurrentValue(startX).setEndValue(dx);
mSpringY.setCurrentValue(startY).setEndValue(dy);
}
public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
mSpringX.setCurrentValue(startX, false);
mSpringY.setCurrentValue(startY, false);
if (startX > maxX || startX < minX) {
if (startX > maxX) {
mSpringX.setEndValue(maxX);
} else if (startX < minX) {
mSpringX.setEndValue(minX);
}
mSpringX.setSpringConfig(RUBBERBANDING_CONFIG);
return true;
}
if (startY > maxY || startY < minY) {
if (startY > maxY) {
mSpringY.setEndValue(maxY);
} else if (startY < minY) {
mSpringY.setEndValue(minY);
}
mSpringY.setSpringConfig(RUBBERBANDING_CONFIG);
return true;
}
return true;
}
public void fling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY, int overX, int overY) {
mSpringX
.setSpringConfig(COASTING_CONFIG)
.setCurrentValue(startX)
.setVelocity(velocityX);
mSpringY
.setSpringConfig(COASTING_CONFIG)
.setCurrentValue(startY)
.setVelocity(velocityY);
}
public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
}
public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
}
public void abortAnimation() {
mSpringX.setAtRest();
mSpringY.setAtRest();
}
@Override
public void onSpringUpdate(Spring spring) {
Log.d("WSB", "cv:" + spring.getCurrentValue());
}
@Override
public void onSpringAtRest(Spring spring) {
}
@Override
public void onSpringActivate(Spring spring) {
}
@Override
public void onSpringEndStateChange(Spring spring) {
}
}