【问题标题】:iPhone Animation: how to anti-alias?iPhone动画:如何抗锯齿?
【发布时间】:2009-10-14 08:21:33
【问题描述】:

我正在查看我的 iPhone 应用程序中的一些动画,感觉有点难看。然后我明白了:它只是不通过亚像素状态进行动画处理。

所以,如果我使用通常的 +beginAnimations/+commitAnimations,移动一些仅几个像素的东西看起来“跳跃”。我怎样才能避免它?是否有任何标志可以通过浮动坐标或其他方式使其动画?

只是为了让您了解我拥有什么以及我在寻找什么,请参考图片:

alt text http://www.ptoing.net/subpixel_aa.gif

提前致谢, 安东

【问题讨论】:

  • 你能更新图片的链接吗?

标签: iphone core-animation antialiasing


【解决方案1】:

这很有趣,但我发现 UIImageView 使用抗锯齿动画其内容,而视图的边缘没有抗锯齿(硬)。这似乎是因为 UIView 本身应该保持相同的边界,而亚像素渲染可能会增加一些边界。

所以,我最后只是在图片周围放置了一些透明空间的图片,一切都很顺利。

只是不要让 UIView 为你剪切它的内容 :)

【讨论】:

【解决方案2】:

您可以尝试从自定义 UIView 派生您正在制作动画的项目,该 UIView 会覆盖其 drawRect 方法并为其设置抗锯齿,然后让父级绘制到其中。大致如下:

- (void) drawRect:(CGRect)area
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSaveGState(context);
  CGContextSetShouldAntialias(context, true);
  CGContextSetAllowsAntialiasing(context, true);
  [super drawRect:area];
  // We have to turn it back off since it's not saved in graphic state.
  CGContextSetAllowsAntialiasing(context, false);
  CGContextRestoreGState(context);
}

另一方面,当您到达这里时,渲染管道可能为时已晚,因此您可能不得不最终推出自己的动画方案,让您可以完全控制像素定位。

【讨论】:

  • 我试过这个。似乎在动画时没有调用 drawRect,因为动画是在下面完成的(我猜)。
  • 是的,我认为可能为时已晚。您可以在 CALayer 级别尝试相同的技巧,但我猜唯一的方法是滚动您自己的精灵移动器。
【解决方案3】:

根据 Jeeva 上面的评论,您可以通过将 info.plist 中的以下选项设置为 YES 来使 UIView 边缘呈现抗锯齿。

Renders with edge antialiasing

这是 Jeeva 指向的链接:

http://www.techpaa.com/2012/06/avoiding-view-edge-antialiasing.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2023-03-29
    • 2011-08-27
    • 2015-05-21
    • 1970-01-01
    • 2022-01-18
    • 2016-04-24
    相关资源
    最近更新 更多