如何使用触摸手势控制CAKeyframeAnimation?

6

我有一个 CAEmitterLayer 沿着一个贝塞尔曲线路径(闭合形式,如一个“8”,由四个控制点组成)进行动画,并使用一个 CAKeyframeAnimation。现在我想通过手指滑动(但不一定在路径上)来控制动画的播放。这种操作是否可行?如果可以,如何实现呢?


我对objective-c非常陌生,不知道如何使用手指触摸操作沿路径引导动画(无论是CAEmitterLayer、UIImageView还是layer)。如果能得到任何小提示就会很高兴... 我尝试了使用一个遮罩图像覆盖在路径上,告诉我手指是否在路径上或旁边,但是粒子也会在路径旁边发射。 - headkit
为什么不直接通过设置位置属性,将发射器层的位置改变到用户手指的位置呢?获取用户位置并不难。 - David Rönnqvist
我需要在关键帧动画的定义路径上放置发射器,但手指只能靠近路径以控制沿路径移动。 - headkit
那么发射器只会在路径上,而手指应该靠近?您想知道如何计算发射器应该在路径上的哪个位置?比如计算用户手指所在位置到路径上最近的点? - David Rönnqvist
1
这可能是一种方法。另一种方法是像控制电影帧一样沿着路径“擦拭”动画,向前和/或向后控制。 - headkit
显示剩余2条评论
1个回答

1
创建一个 CGpoint click; 变量来记住你的初始“拖动”点,然后创建一个本地的 NSEvent 处理程序...
[NSEvent addLocalMonitorForEventsMatchingMask: NSMouseMovedMask
                                             | NSLeftMouseDownMask 
                                      handler:^(NSEvent *e) {
    if ( e.type == NSLeftMouseDown ) click = e.locationInWindow;
    else "yourDelta" = click - e.locationInWindow;  // pseudoCode 
    return e;
}];

"yourDelta" 是初始点与当前位置之间的偏移量... 您也可以通过监视 NSEventScrollWheelMask 并查看 e.deltaX 和 e.deltaY 值来实现类似的结果。
编辑:我对 iOS 上的事件处理不太熟悉,但是同样的技术可以应用于普通事件处理程序...即。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)e {
    click = [e locationInView:_yourView];       
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)e {
    "yourDelta" = click - [e locationInView:_yourView];  // pseudoCode 
}

关于“寻找”您的动画... 一种可能的方法是简单地使用您之前的toValue,而不是基于0或您的模型layerfromValue,而是使用您的layer.presentationLayer值? 没有看到您的完整CAKeyframeAnimation内容很难说。


由于此处标记为“cocoa-touch”,我认为OP正在寻找在iOS设备上实现此功能的方法。是否有一种方法可以根据增量值“查找”CAKeyframeAnimation? - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接