docs: private Animator createAnimation(final View view, float startAlpha, float endAlpha, @Nullable TransitionValues values) {
          final float curAlpha = view.getAlpha();
          startAlpha = curAlpha * startAlpha;
          endAlpha = curAlpha * endAlpha;
  
          if (values != null && values.values.containsKey(PROPNAME_ALPHA)) {
              float savedAlpha = (Float) values.values.get(PROPNAME_ALPHA);
              // if saved value is not equal curAlpha it means that previous
              // transition was interrupted and in the onTransitionEnd
              // we've applied endListenerAlpha. we should apply proper value to
              // continue animation from the interrupted state
              if (savedAlpha != curAlpha) {
                  startAlpha = savedAlpha;
              }
          }
  
          view.setAlpha(startAlpha);
          final ObjectAnimator anim = ObjectAnimator.ofFloat(view, View.ALPHA, endAlpha);
          final FadeAnimatorListener listener = new FadeAnimatorListener(view, curAlpha);
          anim.addListener(listener);
          addListener(new TransitionListenerAdapter() {
              @Override
              public void onTransitionEnd(@NonNull Transition transition) {
                  view.setAlpha(curAlpha);
                  transition.removeListener(this);
              }
          });
          return anim;
      }