Created
September 12, 2014 17:01
-
-
Save willbailey/56d2b94c5e9d0a9cf40c to your computer and use it in GitHub Desktop.
SpringChain.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.facebook.rebound; | |
import java.util.concurrent.CopyOnWriteArrayList; | |
public class SpringChain implements SpringListener { | |
private final SpringSystem mSpringSystem; | |
private final CopyOnWriteArrayList<SpringListener> mListeners; | |
private final CopyOnWriteArrayList<Spring> mSprings; | |
private static final SpringConfig ATTACHMENT_SPRING = SpringConfig.fromOrigamiTensionAndFriction(70, 10); | |
private static final SpringConfig MAIN_SPRING = SpringConfig.fromOrigamiTensionAndFriction(40, 6); | |
private int mControlSpringIndex; | |
static { | |
SpringConfigRegistry.getInstance().addSpringConfig(MAIN_SPRING, "main spring"); | |
SpringConfigRegistry.getInstance().addSpringConfig(ATTACHMENT_SPRING, "attachment spring"); | |
} | |
public static SpringChain create() { | |
return new SpringChain(); | |
} | |
public SpringChain() { | |
mSpringSystem = SpringSystem.create(); | |
mListeners = new CopyOnWriteArrayList<SpringListener>(); | |
mSprings = new CopyOnWriteArrayList<Spring>(); | |
} | |
public SpringChain addSpring(final SpringListener listener) { | |
Spring spring = mSpringSystem | |
.createSpring() | |
.addListener(this) | |
.setSpringConfig(ATTACHMENT_SPRING); | |
mSprings.add(spring); | |
mListeners.add(listener); | |
return this; | |
} | |
public SpringChain setControlSpringIndex(int i) { | |
mControlSpringIndex = i; | |
for (Spring spring : mSpringSystem.getAllSprings()) { | |
spring.setSpringConfig(ATTACHMENT_SPRING); | |
} | |
getControlSpring().setSpringConfig(MAIN_SPRING); | |
return this; | |
} | |
public Spring getControlSpring() { | |
return mSprings.get(mControlSpringIndex); | |
} | |
@Override | |
public void onSpringUpdate(Spring spring) { | |
int idx = mSprings.indexOf(spring); | |
SpringListener listener = mListeners.get(idx); | |
int above = -1; | |
int below = -1; | |
if (idx == mControlSpringIndex) { | |
below = idx - 1; | |
above = idx + 1; | |
} else if (idx < mControlSpringIndex) { | |
below = idx - 1; | |
} else if (idx > mControlSpringIndex) { | |
above = idx + 1; | |
} | |
if (above > -1 && above < mSprings.size()) { | |
mSprings.get(above).setEndValue(spring.getCurrentValue()); | |
} | |
if (below > -1 && below < mSprings.size()) { | |
mSprings.get(below).setEndValue(spring.getCurrentValue()); | |
} | |
listener.onSpringUpdate(spring); | |
} | |
@Override | |
public void onSpringAtRest(Spring spring) { | |
int idx = mSprings.indexOf(spring); | |
mListeners.get(idx).onSpringAtRest(spring); | |
} | |
@Override | |
public void onSpringActivate(Spring spring) { | |
int idx = mSprings.indexOf(spring); | |
mListeners.get(idx).onSpringActivate(spring); | |
} | |
@Override | |
public void onSpringEndStateChange(Spring spring) { | |
int idx = mSprings.indexOf(spring); | |
mListeners.get(idx).onSpringEndStateChange(spring); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment