重绘 Canvas 的内容

Redraw Canvas's Contents

我目前正在我的应用程序中开发随机闪电发生器 class。闪电(扩展视野)是一条随机的蓝色路径,它在一个阶段显露出来,当它显露出来时它会淡出。 我希望闪电重新生成并再次显示在 canvas 上(现在只有一次,稍后我将控制它的重复频率)。 闪电对象 class 构建其路径并在 canvas 上绘制一次。现在我成功地使用 invalidate() 方法创建了一个新闪电(调用 onDraw() 方法),但是闪电不会显示在 canvas.

我该怎么做才能让重生的出现? 提前谢谢你 (:

好的,这是正在发生的事情:

编辑

提醒:这里的根本问题是 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() 修复(稍后会详细介绍),足以让事物定期重新绘制。但后来,我意识到它有一个错误:在第一次闪电之后,"phase" 动画将停止显示。

所以,不要那样修。相反,只需在 animateLightning():

的顶部添加一个调用
setAlpha( 1.0f );

这会导致 alpha 在每次新闪电开始时重置为 1,从而使状态机回到初始状态。

不要在 Runnable 中添加新的 ObjectAnimator;它没有做任何有用的事情。

关于 init2():

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

init2() 重新生成闪电, 重新启动动画状态机。如果在Runnable中没有调用,不会调用(你应该可以通过日志确认),这意味着没有新的闪电,也没有动画。 (如有不同意见,欢迎评论。)

你应该很清楚,第一道闪电只是因为你在所有构造函数中调用 init1()/init2() 才发生的。第二个,以及后来所有的闪电,只是因为 RunnableView 创建后 5 秒开始执行。