package org.lab99.mdt.drawable; import com.nineoldandroids.animation.ObjectAnimator; import java.lang.ref.WeakReference; class ShadowStateChanger extends StateChanger { // Lift on touch // http://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-ink-reactions private final static float TOUCH_LIFT_DEPTH = 2; private final static long DEFAULT_DURATION = 150; private WeakReference<ShadowDrawable> mShadow; private ObjectAnimator mShadowAnimator; private float mPreDepth; ShadowStateChanger(ShadowDrawable shadowDrawable) { mShadow = new WeakReference<ShadowDrawable>(shadowDrawable); mShadowAnimator = ObjectAnimator.ofFloat(getShadow(), "depth", getShadow().getDepth() + 1); mShadowAnimator.setDuration(DEFAULT_DURATION); } private ShadowDrawable getShadow() { return mShadow.get(); } @Override public void onPressed() { if (isRunning()) { cancel(); } else { mPreDepth = getShadow().getDepth(); } mShadowAnimator.setFloatValues(mPreDepth + TOUCH_LIFT_DEPTH); mShadowAnimator.start(); } @Override public void onReleased() { if (isRunning()) { cancel(); } mShadowAnimator.setFloatValues(mPreDepth); mShadowAnimator.start(); } @Override public void onFocused() { } @Override public boolean isRunning() { return mShadowAnimator.isRunning(); } @Override public void cancel() { if (isRunning()) { mShadowAnimator.cancel(); } } public void setDuration(long duration) { mShadowAnimator.setDuration(duration); } }