代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

uiview动画交叉淡入淡出导致alpha下降到1.0以下?

  •  1
  • Ben Zotto sberry  · 技术社区  · 14 年前

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

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

    我希望(使用 任何 动画时间曲线)完美配对的0->1和1->0阿尔法转换将始终加起来是1.0的净阿尔法,在这种测试情况下,我不应该看到阿尔法的任何可见变化,但我确实看到了。

    知道这是怎么回事吗?我可以利用这个来“修复”,但我对在混合中概念上缺少的东西最感兴趣。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   jtbandes    14 年前

    两个alphas加起来是1.0的叠加视图不会像你想象的那样工作。它们是相乘的,而不是相加的。

    我们一次吃一大块吧。这是一个背景,100%的亮度:

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

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

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

    如果我们还有另外50%的视野在上面呢?

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

    另一 后面50%的东西是通过的 . 这意味着50%50%=25%的背景层仍将显示。

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

        2
  •  0
  •   Jeff Kelley    14 年前

    这只是一个没有事实依据的猜测,但是由于alpha表示为 CGFloat ,我建议不要试图假定它的任何内容加起来精确到1.0,因为用这种精度表示浮点很困难。它们加起来可能达到0.99左右,造成了这个伪影。