1

我使用 UIView 动画在两个视图之间交叉淡入淡出。我注意到以下令人惊讶的事实:

如果我(比如说)在同一个地方有两个相同的视图,并且我在它们之间制作了一个交叉淡入淡出动画(例如,在同一个动画中,将 alpha 从 0.0 动画到 1.0,而在另一个动画中从 1.0 动画到 0.0),在在动画中,可见结果在动画期间略低于不透明 - 这是一个明显的伪影,可以通过在交叉淡入淡出的视图后面放置一些其他视图来验证(它在动画期间短暂可见,然后再次被遮挡)。

我希望(使用任何动画时序曲线)完美配对的 0->1 和 1->0 alpha 转换将始终加起来为 1.0 的净 alpha,并且在这种测试情况下,我永远不会看到任何可见的变化阿尔法,但我愿意。

知道这里发生了什么吗?我可以解决这个问题以进行“修复”,但我最感兴趣的是我在混合概念上缺少的东西。

谢谢!

4

2 回答 2

6

两个叠加的 alpha 值加起来为 1.0 的视图并没有像你想象的那样做。它们是相乘的,而不是相加的。

让我们一次吃一大块。这是一个 100% 的背景:

bg
|======>
|======>
|======>
|======>

现在让我们在顶部添加另一个视图,50% 的不透明度。这意味着它可以让 50% 的背景通过

bg 50%
|===|===>
|===|
|===|===>
|===|

如果我们在顶部有另外 50% 的视图怎么办?

bg 50% 50%
|===|===|===>
|===|   |
|===|===|
|===|   |

后面的东西还有50%是通过的。这意味着 50% × 50% = 25% 的背景层仍然会显示出来。

现在,你真正想做的是什么?您希望新视图平滑显示,通过旧视图的数量增加。所以只需堆叠两个视图,并淡出顶部的视图,但始终将底部保持为 100% 不透明度。否则,您将在动画期间显示一些背景。

于 2010-08-11T19:21:23.690 回答
0

这只是一个猜测,没有实际事实基础,但由于 alpha 表示为 a CGFloat,我建议不要尝试假设任何关于它的确切加起来等于 1.0,因为很难用这种精度表示浮点数。它们加起来可能达到 0.99 左右,从而导致了这种伪影。

于 2010-08-11T19:13:51.943 回答