重绘 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()
才发生的。第二个,以及后来所有的闪电,只是因为 Runnable
在 View
创建后 5 秒开始执行。
我目前正在我的应用程序中开发随机闪电发生器 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()
才发生的。第二个,以及后来所有的闪电,只是因为 Runnable
在 View
创建后 5 秒开始执行。