ОК, вот что происходит:
РЕДАКТИРОВАТЬ
Напоминаем: проблема 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
.