【问题标题】:Anti-aliasing while animating "transform" property on CALayer?在CALayer上为“变换”属性设置动画时抗锯齿?
【发布时间】:2010-07-24 14:57:45
【问题描述】:

我有一个 CALayer,在它的最终尺寸上画了一个圆圈。我想为圆圈设置动画,使其以 1% 的比例开始并以 100% 的比例结束。现在动画不是很流畅,因为在缩放时边缘会闪烁。在最终尺寸下,圆圈看起来是正确的。我想知道是否有办法在动画本身期间进行抗锯齿。

CATransform3D fromTransform = CATransform3DMakeScale(0.01, 0.01, 1.0);
CATransform3D toTransform = CATransform3DMakeScale(1.0, 1.0, 1.0);

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
theAnimation.duration = 1.5;
theAnimation.fromValue = [NSValue valueWithCATransform3D:fromTransform];
theAnimation.toValue = [NSValue valueWithCATransform3D:toTransform]; 

[myLayer addAnimation:theAnimation forKey:@"animateScale"];

【问题讨论】:

    标签: objective-c transform calayer antialiasing


    【解决方案1】:

    我认为没有办法改变图层的缩放方式。但是,您可以通过将多个分辨率的圆圈渲染到不同大小的图层并同时为它们设置动画来获得更好的结果——逐渐缩放和淡入/淡出更大的图层,直到您到达最终的全尺寸图层。

    您也可以尝试直接逐帧绘制圆,而不是为图层大小设置动画 - 如果绘制速度足够快,您将保持良好的帧速率,并且不会出现任何缩放伪影。如果您选择此路径,通常最好在专用于该动画的单独线程上执行此操作,而不是使用主线程。

    在类似的情况下,我通常只是软化我的绘图边缘——一个精心挑选的阴影或光晕在减少锯齿伪影方面效果显着,而且它比任何其他解决方案都简单得多。 (还请注意,圆圈的笔画宽度随图层缩放:如果您在黑色背景上使用全尺寸 1 像素的线宽绘制一个白色圆圈,那么在 1% 时,线条将只有 0.01 像素宽!​​)

    【讨论】:

    • 感谢您的意见。我有一种感觉,就是这种情况。我在 iPhone 上这样做,所以过滤器不可用。我将尝试逐帧方法。关于使用线程的好建议!
    【解决方案2】:

    方法:使用layer.shouldRasterize

    1. 创建一个superlayer/superview,在所有 4 个方向上都大 1 个像素
    2. superlayer/superview进行转换
    3. 在原layer/view上启用layer.shouldRasterize

    方法:绘制到UIImage

    • 将您的内容绘制到 UIImage
    • 确保内容周围有 1 个像素的透明边框
    • 显示图片

    参考:http://darknoon.com/2012/05/18/the-transparent-border-trick/

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2011-08-27
      • 2012-01-08
      相关资源
      最近更新 更多