Skip to content

Instantly share code, notes, and snippets.

@willbailey
Created September 12, 2014 17:01
Show Gist options
  • Save willbailey/56d2b94c5e9d0a9cf40c to your computer and use it in GitHub Desktop.
Save willbailey/56d2b94c5e9d0a9cf40c to your computer and use it in GitHub Desktop.
SpringChain.java
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