private void animate(float[] movements, int duration, boolean bounce, AnimatorListener listener) {
    if (mAbAnimation.isRunning()) {
      mAbAnimation.cancel();
    }

    mAbAnimation = ObjectAnimator.ofFloat(this, "translationY", movements);
    mAbAnimation.setDuration(duration);
    if (listener != null) {
      mAbAnimation.addListener(listener);
    }

    if (mShadow != null) {
      if (mShadowAnimation.isRunning()) {
        mShadowAnimation.cancel();
      }

      mShadowAnimation = ObjectAnimator.ofFloat(mShadow, "translationY", movements);
      mShadowAnimation.setDuration(duration);

      if (bounce) {
        AnimatorUtils.bounceAnimator(mShadowAnimation, movements, 5, 100);
      } else {
        mShadowAnimation.start();
      }
    }

    if (bounce) {
      AnimatorUtils.bounceAnimator(mAbAnimation, movements, 5, 100);
    } else {
      mAbAnimation.start();
    }
  }