iOS中的动画线段

Posted

技术标签:

【中文标题】iOS中的动画线段【英文标题】:Animate line segment in iOS 【发布时间】:2013-03-01 20:56:26 【问题描述】:

ios 中,我想创建一个线段对象并为其起点和终点设置动画(我可以在 Microsoft 的 WPF 中做到这一点)。

目前,我将线段对象创建为一个微小的CALayer,我使用变换拉伸旋转

+(LayLine*) layLineWithStartPoint:(CGPoint)ptStart andEndPoint:(CGPoint)ptEnd
    LayLine* line = [[LayLine alloc] init]; 
    line.backgroundColor = [UIColor blackColor].CGColor;
    line.frame = CGRectMake(0,-1,1,2);  // Line 1 pixel long and 2 pixel wide line segment
    line.anchorPoint = CGPointMake(0,0);

    line.affineTransform = [LayLine affineTransformationForLineSegment:ptStart to:ptEnd];   
    return line;

我可以通过改变它的变换来动画这条线段。

这工作得很好,但并不完美,因为在动画过程中,终点并不像我想要的那样沿着直线。因此,我想知道是否有更好的方法来创建可以动画的线段对象?

【问题讨论】:

你说的是哪种动画?这两个点是在不同的路径上传播,还是只是在同一条恒定路径上的不同位置? @Tommy,我不确定我是否理解你的问题,但是 ptStartA-ptEndA 应该移动到 ptStartB-ptEndB (线段 B 可能垂直于线段 A)。 【参考方案1】:

您可以使用CAShapeLayer 并创建一个仅包含两个控制点的CGPath。 CAShapeLayer 本身的路径属性实际上是可动画的(只要新路径具有相同数量的点)加上您获得 CALayer 的所有变换功能。正如刚才提到的Tommy,您可以使用strokeStartstrokeEnd 来制作一些非常酷的动画(还有lineDashPattern 可以很好地与lineDashPhase 一起制作动画,但我猜你不需要那个)。

来自this question的代码示例:

CAShapeLayer *lineShape = nil;
CGMutablePathRef linePath = nil;
linePath = CGPathCreateMutable();
lineShape = [CAShapeLayer layer];

lineShape.lineWidth = 1.0f;
lineShape.lineCap = kCALineJoinMiter;
lineShape.strokeColor = [[UIColor redColor] CGColor];

CGPathMoveToPoint(linePath, NULL, x, y);
CGPathAddLineToPoint(linePath, NULL, toX, toY);

lineShape.path = linePath;
CGPathRelease(linePath);

【讨论】:

... 我问的问题是相关的,因为 strokeEndstrokeStart 属性也是可动画的,所以你可以不理会路径,只为你绘制的部分设置动画你有兴趣。例如我将它用于我的一个应用程序中的圆形进度条——它只是一个带有粗笔划的圆形路径,我让 Core Animation 在strokeEnd 上完成工作。 要为路径设置动画,我必须以某种方式将其转换为 NSValue? 我不知道你是如何制作动画的。但 CGPathRef 可以桥接到 id 类型。见***.com/questions/9513082/…

以上是关于iOS中的动画线段的主要内容,如果未能解决你的问题,请参考以下文章

Android自己定义View画图实现拖影动画

Android自定义View绘图实现拖影动画

线段树区间更新 费马小定理|魔豆传奇

从圆形或甜甜圈中绘制线段

线段树维护二维平面中的线段

如何在Mapbox GL JS动画中为LineString分段着色不同