Перерисовать содержание холста - PullRequest
0 голосов
/ 09 января 2020

В настоящее время я работаю над классом генератора случайных молний в моем приложении. Молния (расширяет вид) - это случайный синий путь, который раскрывается в фазе, а когда он обнаруживается, он исчезает. Я хочу, чтобы молния регенерировала и снова показалась на холсте (пока только один раз, позже я буду контролировать ее частоту повторения). Класс объектов-молний строит свой путь и рисует его на холсте один раз. Прямо сейчас мне удается создать новую молнию, используя метод invalidate() (для вызова метода onDraw()), но молния не будет отображаться на холсте.

Что я могу сделать для восстановленного те, чтобы показать? Заранее спасибо (:

1 Ответ

1 голос
/ 10 января 2020

ОК, вот что происходит:

РЕДАКТИРОВАТЬ

Напоминаем: проблема root в том, что View's alpha застревает в 0, что означает, что все операции рисования скрыты, как только исчезает первая молния.

В моей первой ревизии я не был так конкретен c, как следовало бы. Я просто хотел, чтобы вы изменили эту строку:

final ObjectAnimator alpha = ObjectAnimator.ofFloat(RandomLightning.this, "alpha", 0);

на эту:

final ObjectAnimator alpha = ObjectAnimator.ofFloat(RandomLightning.this, "alpha", 1.0f, 0);

Что в сочетании с исправлением init2() (подробнее об этом позже) достаточно, чтобы получить вещи перерисовывают через равные промежутки времени. Но позже я понял, что в ней есть ошибка: после 1-й молнии «фазовая» анимация перестает отображаться.

Итак, не исправляйте это так . Вместо этого просто добавьте вызов к вершине animateLightning():

setAlpha( 1.0f );

. Это заставит alpha сбрасываться в 1 в начале каждой новой молнии, таким образом, возвращая конечный автомат в исходное состояние. начальное состояние.

Не добавлять новый ObjectAnimator к Runnable; ничего полезного не получается.

О init2 ():

Я не уверен, почему вы считаете, что init2() в Runnable не нужен или избыточный. Похоже, вы неправильно понимаете поток управления, но я не могу понять, что это такое.

init2() восстанавливает вашу молнию, и перезапускает конечный автомат анимации. Если он не вызывается в Runnable, , ничто другое не будет вызывать его (вы должны быть в состоянии подтвердить это с помощью журнала), а это означает, что не будет никакой новой молнии и никакой анимации. (Если вы не согласны, пожалуйста, не стесняйтесь комментировать.)

Для вас должно быть ясно, что первая молния происходит только потому, что вы вызываете init1()/init2() во всех конструкторах. Вторая и все последующие молнии происходят только потому, что Runnable начинает выполняться через 5 секунд после создания View.

...