docs: @Nullable
      public static Animator createAnimation(View view, TransitionValues values, int viewPosX, int viewPosY,
                                             float startX, float startY, float endX, float endY, TimeInterpolator interpolator,
                                             @NonNull Transition transition) {
          if (TRANSLATIONS_PROPERTY == null) {
              return null;
          }
          float terminalX = view.getTranslationX();
          float terminalY = view.getTranslationY();
          int[] startPosition = (int[]) values.view.getTag(R.id.transitionPosition);
          if (startPosition != null) {
              startX = startPosition[0] - viewPosX + terminalX;
              startY = startPosition[1] - viewPosY + terminalY;
          }
          // Initial position is at translation startX, startY, so position is offset by that amount
          int startPosX = viewPosX + Math.round(startX - terminalX);
          int startPosY = viewPosY + Math.round(startY - terminalY);
  
          view.setTranslationX(startX);
          view.setTranslationY(startY);
          Animator anim = AnimatorUtils.ofPointF(view, TRANSLATIONS_PROPERTY,
                  startX, startY, endX, endY);
  
          if (anim != null) {
              TransitionPositionListener listener = new TransitionPositionListener(view, values.view,
                      startPosX, startPosY, terminalX, terminalY);
              transition.addListener(listener);
              anim.addListener(listener);
              AnimatorUtils.addPauseListener(anim, listener);
              anim.setInterpolator(interpolator);
          }
          return anim;
      }