Android ObjectAnimator внутри собственного представления

У меня есть пользовательский вид вроде индикатора выполнения. внутри этого представления у меня есть ObjectAnimator.AnimatorUpdateListener, который я пытаюсь использовать, чтобы вызвать инвалидацию в представлении. Тем не менее, мой взгляд не обновляется! Я попытался добавить кнопку, которая просто изменила значение на что-то другое, и однажды вызвала инвалидность, и это сработало, мое представление обновилось, чтобы отразить изменение значения.

Я что-то здесь упускаю? Я называю недействительным слишком много раз или что-то?

Мой "прогрессбар" начинается с плавающего числа в 0, и анимация должна анимировать его до 100. Вызов метода, чтобы обновить его до 50 и вызвать инвалидацию работает, но ObjectAnimator, кажется, не вызывает инвалидацию.

Все вызывается в потоке пользовательского интерфейса

2 ответа

ObjectAnimator не вызывает invalidate() - вы должны метод, когда это необходимо

ObjectAnimator oAnimator = ObjectAnimator.ofInt(view,"someproperty",0,100)

void SetSomeproperty(value) {
    mValue = value
    invalidate()
}

Я использовал это, и это сработало.

public interface ProgressAnimationListener {
    public void onAnimationStart();

    public void onAnimationFinish();

    public void onAnimationProgress(int progress);
}

private ObjectAnimator progressBarAnimator;

  public synchronized void animateProgressTo(final int start, final int end, final int duration, final ProgressAnimationListener listener) {

        stopAnimation();
        setProgress(start);

        progressBarAnimator = ObjectAnimator.ofFloat(this, "animateProgress", start, end);
        progressBarAnimator.setDuration(duration);

        progressBarAnimator.setInterpolator(new LinearInterpolator());

        progressBarAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationCancel(final Animator animation) {
            }

            @Override
            public void onAnimationEnd(final Animator animation) {
                setProgress(end);
                if (listener != null) {
                    listener.onAnimationFinish();
                }
            }

            @Override
            public void onAnimationRepeat(final Animator animation) {
            }

            @Override
            public void onAnimationStart(final Animator animation) {
                if (listener != null) {
                    listener.onAnimationStart();
                }
            }
        });

        progressBarAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(final ValueAnimator animation) {
                int progress = ((Float) animation.getAnimatedValue()).intValue();
                if (progress != getProgress()) {
                    //Log.d(TAG, progress + "");
                    setProgress(progress);
                    if (listener != null) {
                        listener.onAnimationProgress(progress);
                    }
                }
            }
        });
        progressBarAnimator.start();
    }

    public synchronized boolean isAnimationRunning() {
        return progressBarAnimator != null && progressBarAnimator.isRunning();
    }

    public synchronized void stopAnimation() {
        if (isAnimationRunning()) {
            progressBarAnimator.cancel();
            progressBarAnimator = null;
        }
    }
Другие вопросы по тегам