new AwesomeAnimation.Builder((View) card) .addObjectAnimation(AnimationsUtil.createCardAnimation( card.getCardInfo(), DebertzCardModel::isCardIconSet, (info) -> setIconForCard(card, Optional.of(cardModel.getCard())))) .setDuration(animationDuration) .setInterpolator(new AccelerateDecelerateInterpolator()) .build() .start(); @SuppressWarnings("ConstantConditions") public static AwesomeAnimation.AnimationParams createCardAnimation(@NonNull CardInfo card, @NonNull Predicate ignorePredicate, @NonNull DoOnHalfRotateCard doOnHalfRotateCard) { final DebertzCardModel entity = (DebertzCardModel) card.getEntity(); return new AwesomeAnimation.AnimationParams .Builder(View.ROTATION_Y, 0, 90, 0) .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() { private float lastRotation = -1; @Override public void onAnimationUpdate(ValueAnimator animation) { if (ignorePredicate.test(entity)) { return; } float rotation = (Float) (animation.getAnimatedValue()); if (rotation < lastRotation || Math.abs(rotation - 90) < EPSILON) { doOnHalfRotateCard.onHalfRotate(card); } lastRotation = rotation; } }) .setAnimatorListenerAdapter(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (ignorePredicate.test(entity)) { return; } doOnHalfRotateCard.onHalfRotate(card); } }) .build(); }