我目前正在我的应用程序中研究一个随机闪电发生器类。闪电(扩展“视图”)是一个随机的蓝色路径,该路径分阶段显示,当显示时逐渐消失。
我希望闪电重新生成并再次显示在画布上(现在仅一次,稍后我将控制其重复频率)。
lightning-objects类建立其路径并将其绘制在画布上一次。现在,我成功地使用invalidate()方法创建了一个新的闪电(称为onDraw()方法),但是该闪电不会显示在画布上。

为了使再生的显示出来,我该怎么办?
先感谢您 (:

最佳答案

好的,这是怎么回事:

编辑

提醒您:根本问题是View's alpha停留在0,这意味着一旦第一道闪电消失,所有绘制操作都将被隐藏。

在我的第一个修订版中,我没有应有的明确性。我只希望您更改此行:

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


对此:

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


将其与init2()修复程序结合使用(稍后再介绍),足以使事物定期重绘。但是后来,我意识到它有一个错误:第一道闪电过后,“阶段”动画将停止显示。

因此,请勿以这种方式修复它。相反,只需在animateLightning()的顶部添加一个调用即可:

setAlpha( 1.0f );


这会使alpha在每个新的闪电开始时重置为1,从而使状态机回到原始的启动状态。

不要将新的ObjectAnimator添加到Runnable;它没有任何用处。

关于init2():

我不确定为什么您认为init2()中的Runnable是不必要的或多余的。您似乎对控制流有误解,但是我不能指望它是什么。

init2()重新生成您的闪电,然后重新启动动画状态机。如果未在Runnable中调用它,则不会再调用它(您应该能够使用日志来确认它),这意味着没有新的闪电,也没有动画。 (如果您不同意,请随时发表评论。)

您应该清楚,第一次闪电只发生是因为您在所有构造函数中都调用了init1()/init2()。第二次以及以后发生的所有闪电,仅是因为Runnable在创建View后5秒钟开始执行。

关于java - 重画Canvas的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59654726/

10-13 03:27