Как бы вы реализовали setScaleX и setTranslateX для Drawable, аналогичного реализованному для View? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу использовать ObjectAnimator в пользовательском Drawable (который оборачивает другой внутренний Drawable toEducate только для того, чтобы дать ему эти возможности анимации).

Я пробовал следующее, но анимация не видится как ожидается.

В моей реализации что-то отсутствует?

  public void setScaleX(float scaleX) {
    Rect bounds = toEducate.copyBounds();
    bounds.right = (int) (bounds.right + scaleX/2);
    bounds.left = (int) (bounds.left - scaleX/2);
    toEducate.setBounds(bounds);
    toEducate.invalidateSelf();
    this.invalidateSelf();
  }

 public void setTranslationX(float translationX) {
    Rect bounds = toEducate.copyBounds();
    bounds.right = (int) (bounds.right + translationX);
    bounds.left = (int) (bounds.left + translationX);
    toEducate.setBounds(bounds);
    toEducate.invalidateSelf();
    this.invalidateSelf();
  }

при воспроизведении этой анимации:

    educationAnimatorSet.playTogether(
        ImmutableList.of(
            ObjectAnimator.ofFloat(educationDrawable, "translationX", 1000).setDuration(2000),
            ObjectAnimator.ofFloat(educationDrawable, "translationY", 1000).setDuration(2000)));

и

    educationAnimatorSet.playTogether(
        ImmutableList.of(
            ObjectAnimator.ofFloat(educationDrawable, "scaleX", 1000).setDuration(2000),
            ObjectAnimator.ofFloat(educationDrawable, "scaleY", 1000).setDuration(2000)));

1 Ответ

0 голосов
/ 11 апреля 2020

Math в вашем setScaleX методе выглядит неправильно, потому что он не увеличивает ширину scaleX раз, я имею в виду следующие строки:

public void setScaleX(float scaleX) {
    ...
    bounds.right = (int) (bounds.right + scaleX/2);
    bounds.left = (int) (bounds.left - scaleX/2); 
    ...
} 

Я думаю, что метод должен быть примерно таким (для точки поворота) в центре)

    public void setScaleX(float scaleX) {
        int centerX = bounds.left + bounds.width/2;
        int newWidth = bounds.width * scaleX;

        Rect bounds = toEducate.copyBounds();
        bounds.right = centerX + newWidth/2
        bounds.left = centerX - newWidth/2
        toEducate.setBounds(bounds);
        toEducate.invalidateSelf();
        this.invalidateSelf();
    }

Также проверьте, существуют ли методы getScaleX, getScaleY, getTranslationX, getTranslationY и возвращают правильные значения. Насколько я знаю, геттеры для пользовательских анимированных свойств также должны быть предоставлены.

...