代码之家  ›  专栏  ›  技术社区  ›  Yang Meyer

在周期性的动画进程间隔中调用方法的caanimation?

  •  3
  • Yang Meyer  · 技术社区  · 14 年前

    假设我想让一个滚动1000像素的球动画到右边,在这个过程中指定一个计时函数,类似于:

    uiview*ball=[[uiview alloc]initwithframe:cgrectmake(0,0,30,30)]
    赤霞石化=
    [带键路径的cabasicanimation动画:@“transform.translation.x”];
    anim.tovalue=[nsnumber numberwithfloat:ball.frame.origin.x+1000.0];
    //向右移动1000像素
    anim.duration=10.0;
    anim.timingfunction=[带控制点的camereditingfunction函数:
    0.1:0.0:0.3:1.0];//加速快,减速慢
    [ball.layer addAnimation:anim forkey:@“MyMoveRightAnim”];
    < /代码> 
    
    

    我最终想要的是有一个方法,比如说动画进程回调:(float)progress,be called during the animation,in regular intervals of the animation's progressin terms of the absolute“Distance”between start and end values,i.e.Ignoring the timing function.

    我将用上面的例子解释一下,球向右滚动1000px(用y轴表示,在我们的例子中100%=1000px):。

    我希望在球进展250像素时调用回调方法。由于定时功能,头250个像素可能在ti02秒时达到,达到总距离的一半仅为ti10.7秒后(快速加速开始),750像素标记另一个ti21.1秒后,并且需要剩余的ti35.2秒以达到100%(1000像素)标记。

    什么会很好,但没有提供:

    如果动画在动画进度间隔中调用了委托方法,那么我不需要问这个问题。

    想法如何解决问题:

    我能想到的一个解决方案是计算贝塞尔曲线的值,将其映射到tikvalues(我们知道总动画持续时间),并且当动画开始时,我们依次执行我们的animationProgresssBack:.selector with these delays manually.

    显然,这是疯狂的(手动计算贝塞尔曲线??)更重要的是,不可靠(我们不能依赖动画线程和主线程同步,还是可以?)

    有什么想法吗?

    期待您的想法!

    UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(0,0,30,30)];
    CABasicAnimation* anim =
            [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
    anim.toValue = [NSNumber numberWithFloat:ball.frame.origin.x + 1000.0];
                                                // move 1000 pixels to the right
    anim.duration = 10.0;
    anim.timingFunction = [CAMediaTimingFunction functionWithControlPoints:
                          0.1 :0.0 :0.3 :1.0]; // accelerate fast, decelerate slowly
    [ball.layer addAnimation:anim forKey:@"myMoveRightAnim"];
    

    我最终想要的就是要有一个方法,比如说-(void)animationProgressCallback:(float)progress在动画过程中,以动画进程的定期间隔调用从开始值和结束值之间的绝对“距离”来看,即忽略定时功能。

    我将用上面的例子解释一下,球向右滚动1000px(用y轴表示,在我们的例子中100%=1000px):

    alt text

    我希望在球进展250像素时调用回调方法。由于定时功能,在TI中可能会达到前250个像素。=2秒,总距离的一半仅为ti=0.7秒后(快速加速开始),750像素标记另一个ti=1.1秒后,需要剩余的ti=5.2秒,达到100%(1000px)标记。

    什么是最好的,但没有提供:

    如果动画在动画进度间隔中调用了委托方法,那么我不需要问这个问题-)

    如何解决问题的想法:

    我能想到的一个解决方案是计算贝塞尔曲线的值,将其映射到tiK值(我们知道总动画持续时间),当动画开始时,我们依次执行animationProgresssCallback:手动延迟的选择器。

    显然,这是疯狂的(手动计算贝塞尔曲线??)更重要的是,不可靠(我们不能依赖动画线程和主线程同步,还是可以?).

    有什么想法吗??

    期待您的想法!

    1 回复  |  直到 14 年前
        1
  •  1
  •   nacho4d    14 年前

    如何解决问题的想法:

    我能想到的一个解决办法是 计算贝塞尔曲线的值, 将其映射到tik值(我们知道 总动画持续时间),以及 当动画开始时,我们 按顺序执行 动画进度后退:选择器 手动延迟。

    显然,这是疯狂的(计算 贝塞尔曲线手动?等等) 重要的是,不可靠(我们不能依赖 在动画线程和主线程上 线程是否同步?.

    事实上,这是可靠的。CoreAnimation是基于时间的,因此可以使用代理在动画真正开始时得到通知。 关于计算贝塞尔路径…好吧,这样看:如果你想在Opengles中实现一个曲面,情况可能会更糟,你必须计算一个三次贝塞尔曲线!你的情况只是一维的,如果你知道数学的话就不难了。