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;
}
}