精华内容
下载资源
问答
  • animation

    2018-11-22 22:45:39
    和其他CSS3属性类似,animation包含很多子属性,我们一起看看: animation-name animation-duration animation-timing-function animation-delay animation-iteration-count animation-direction animation-...

    和其他CSS3属性类似,animation包含很多子属性,我们一起看看:

    • animation-name
    • animation-duration
    • animation-timing-function
    • animation-delay
    • animation-iteration-count
    • animation-direction
    • animation-play-state
    • animation-fill-mode
    • @keyframes

    animation-name指定@keyframes的名字,CSS加载时会应用该名字的@keyframes规则来实现动画

    animation-duration动画持续时间,默认是0表示无动画,单位可以设s秒或ms毫秒

    animation-timing-function动画播放方式,默认值ease,可以设lineareaseease-inease-outease-in-outcubic-bezier(n,n,n,n)steps。关于贝塞尔曲线和steps可以参照上一篇transition,和transition-timing-function类似,不多赘述。

    animation-delay延迟开始动画的时间,默认值是0,表示不延迟,立即播放动画。单位是s秒或ms毫秒。允许设负时间,意思是让动画动作从该时间点开始启动,之前的动画不显示。例如-2s 使动画马上开始,但前 2 秒的动画被跳过。

    animation-iteration-count动画循环播放的次数,默认值为1,即放完一遍后不循环播放。除数字外也可以设关键字infinite表示无限循环播放。

    animation-direction动画播放的方向,可设normalalternatealternate-reverse。默认值是normal表示正常播放动画。alternate表示轮转正反向播放动画,即动画会在奇数次(1,3,5…)正常播放,而在偶数次(2,4,6…)反向播放。alternate-reverse正好反过来,奇数次反向播动画,偶数次正向播动画。看效果点这里

    .myDiv1 {
        width: 75px;
        height: 75px;
        background-color: red;
        position:relative;
        animation:aDirection 5s infinite;
    } 
    @keyframes aDirection {
        from {left:0px;}
        to {left:200px;}
    }
    .alter { animation-direction:alternate; }
    .alterR { animation-direction:alternate-reverse; } 
    
    <div class="myDiv1"></div>
    <div class="myDiv1 alter"></div>
    <div class="myDiv1 alterR"></div>

    有什么用呢?其实例子页面就能看到alternate/alternate-reverse的动画效果可以平滑地实现反转效果。例如例子页面中闪烁提示的例子。你可以用text-decoration: blink来实现闪烁,但它的功能有限支持有限。用CSS3动画实现的闪烁效果更棒。(当然闪烁的使用必须克制,要定时定次数,不能无限闪。无限闪通常会让用户很生气后果很严重):

    @keyframes blink { 
        to { color: transparent }   //文字色平滑过渡到透明
    }
    .blink {
        animation: .5s blink 6; //触发动画6次,因为设了alternate,所以看上去闪烁了3次
        animation-direction: alternate;
    }
    

    animation-play-state动画的状态,可设runningpaused。默认值running表示正在播放动画,paused表示暂停动画。通常在JS端使用该属性object.style.animationPlayState=”paused”来暂停动画。

    animation-fill-mode动画的时间外属性,可设noneforwardsbackwardsboth。默认值none表示动画播完后,恢复到初始状态。forwards当动画播完后,保持@keyframes里最后一帧的属性。backwards表示开始播动画时,应用@keyframes里第一帧的属性,要看出效果,通常要设animation-delay延迟时间。both表示forwards和backforwards都应用。

    例如设置2s的延迟时间。初始为红色,第一帧动画变为绿色,最后一帧动画变为蓝色。看效果点这里

    .myDiv2 {
        width: 75px;
        height: 75px;
        background-color: red;
        position:relative;
        animation:mymove 5s 1 2s;
    }
    @keyframes mymove {
        from {left:0px; background-color:green;}
        to {left:200px; background-color: blue;}
    }
    .forwards { animation-fill-mode:forwards; }
    .bkforwards { animation-fill-mode:backwards; }
    .both { animation-fill-mode:both; } 
    
    <div class="myDiv2"></div>
    <div class="myDiv2 forwards"></div>
    <div class="myDiv2 bkforwards"></div>
    <div class="myDiv2 both"></div>
    

    图1不解释了,最正常的效果,初始为红色,动画开始成绿色,动画结束成蓝色,结束后恢复初始状态红色。图2设成forwards,和图1的区别是动画结束后不恢复初始状态,仍旧是蓝色。图3设成backwards,在动画开始前(即延迟时间段内)应用第一帧的动作,设成了绿色,动画结束后恢复原始状态。图4设成both兼具forwards和backwards的效果。

    @keyframes动画帧就是区别animation和transition的关键。在transition中是无法更细致地控制时间段内执行的动作的,而在animation中用@keyframes可以细致地指定第一帧要干什么,第二帧要干什么。

    语法:@keyframes开头,后接animation-name。实体内可以创建%百分比来划分时间段。关键字from等于0%,to等于100%。

    @keyframes mymove {
        0%   {top:0px; left:0px; background:red;}
        25%  {top:0px; left:100px; background:blue;}
        50%  {top:100px; left:100px; background:yellow;}
        75%  {top:100px; left:0px; background:green;}
        100% {top:0px; left:0px; background:red;} 
    }
    

    为节约篇幅,各种浏览器前缀均省略,如Firefox用@-moz-keyframes,Chrome和Safari用@-webkit-keyframes,Opera用@-o-keyframes。提醒一下@keyframes只是定义了一个动画效果,但要使动画生效,必须用animate属性将动画绑定到具体某DOM元素上才行。

    你可以单独指定上面这些子属性,也可以像background等属性一样,合并在animation属性里指定。例如animation: moveten 1s step(10,end) infinite alternate 3s backwards;。但合并时要注意,因为有animation-duration和animation-delay都是时间,浏览器会根据先后顺序,将第一个时间认作为animation-duration,第二个时间认作为animation-delay。

    分开指定可能代码清晰点,但因为页面需要适应各浏览器时,每个都要加上-ms,-moz等前缀的话代码会变的很多,合并在一起代码稍微少点。

    另外也可以同时指定多个动画效果,例如animation: moveten1 1s ease .5s, moveten2 2s ease 1s forwards;

    总结

    animation的参数不算多,但知道理论是一回事,能否写出精妙的动画效果是另一回事。除非你特有天赋,否则可以借鉴牛人们的设计。例如Dan Edenanimate.css动画库,里面设计出的贝塞尔曲线能让动画效果非常逼真。

    CSS3里三大动画相关属性transform,transition,animation基本内容就介绍完了。有些子属性如果不明白原理的话,代码给你都很难改,更别说自己写。现在看到酷炫的动画效果,可以试着看看源码,并对照着改成自己想要的效果。下一篇将介绍一些常见实用的动画效果。



    作者:张歆琳
    链接:https://www.jianshu.com/p/ed11f8c26992
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • Animation

    千次阅读 2016-12-09 10:59:38
    一、iOS动画 iOS中实现一个动画十分简单,在view层面上通过调用 ...但是它不能控制动画的暂停和组合,所以就需要用到CoreAnimation了。 iOS中的动画主要分为:基础动画(CABasicAnimation)、关键帧动画(CA

    一、iOS动画

    iOS中实现一个动画十分简单,在view层面上通过调用

    [UIView animateWithDuration:duration animations:^{
            //执行动画
     }]
    

    但是它不能控制动画的暂停和组合,所以就需要用到CoreAnimation了。 iOS中的动画主要分为:基础动画(CABasicAnimation)、关键帧动画(CAKeyFrameAnimation)、动画组(CAAnimationGroup)、转场动画(CATransition),关系图如下

    动画关系图

    • CAAnimation:核心动画的基础类,不能直接使用,负责动画运行时间、速度控制,本身是实现了CAMediaTiming协议
    • CAPropertyAnimation:属性动画的基类,即通过属性进行动画设置,不能直接使用。
    • CAAnimationGroup:动画组,可以通过动画组来进行所有动画行为的统一控制,组中所有动画可以并发执行。
    • CATransition:转场动画,主要通过滤镜进行动画效果设置。
    • CABasicAnimation:基础动画,通过修改属性进行动画参数控制,只有初始状态和结束状态。
    • CAKeyFrameAnimation:关键帧懂的规划,通过修改属性进行动画,可以有多个状态控制。

    二、简单动画的实现(CABasicAnimation)

    You can perform simple animations implicitly or explicitly depending on your needs. Implicit animations use the default timing and animation properties to perform an animation, whereas explicit animations require you to configure those properties yourself using an animation object. So implicit animations are perfect for situations where you want to make a change without a lot of code and the default timing works well for you.

    apple提供隐式动画和显式动画两种,隐式动画使用系统默认的时间和属性,如果要显式动画,需要用户自己配置属性。当用户想要用少量代码和默认的时间实现简单的动画,用隐式就行了。

    什么是隐式动画,显式动画?

    • 隐式动画就是不需要手动调用动画方法,系统默认提供的动画效果,时间是1/4秒,root layer没有隐式动画。当你改变了layer的属性,apple会立刻把这个属性改变,但是会通过呈现树以动画的形式展示改变的效果(这也就是为什么apple建议通过presentationLayer的属性来访问当前屏幕上的layer信息了),这个动态改变的过程就是隐式动画。
    • 显式动画是开发者自定义的动画效果,可以设置属性改变的时间长度,改变的效果(淡入淡出等)。

    2.1 单个动画

    实现简单动画通常都用CABasicAnimation对象和用户配置好的动画参数来实现,通过调用basicAni的addAnimation:forKey:方法将动画添加到layer里面,这个方法会根据填入的key值来决定让哪个属性进行动画。

    图层动画的本质就是将图层内部的内容转化为位图经硬件操作形成一种动画效果,其实图层本身并没有任何的变化 也就是说动画不会从根本上改变layer的属性,只是展示属性变化的效果

    简单动画会在一定时间内通过动画的形式改变layer的属性值,比如用动画效果将透明度opacity从1到0: 以透明度为例实现简单动画:

    CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fade.fromValue = [NSNumber numberWithFloat:1.0];
    fade.toValue = [NSNumber NumberWithFloat:0.0];
    fade.duration = 1.0;
    //注意key相当于给动画进行命名,以后获得该动画时可以使用此名称获取
    [self.layer addAnimation:fade forKey:@"opacity];
    //动画不会真正改变opacity的值,在动画结束后要手动更改
    self.opacity = 0;
    

    还可以通过animation 的delegate方法监测动画是否执行完毕

    CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fade.fromValue = [NSNumber numberWithFloat:1.0];
    fade.toValue = [NSNumber NumberWithFloat:0.0];
    fade.duration = 1.0;
    fade.delegate = self;
    //注意key相当于给动画进行命名,以后获得该动画时可以使用此名称获取
    [self.layer addAnimation:fade forKey:@"opacity];
    //动画不会真正改变opacity的值,在动画结束后要手动更改
    
    //代理方法
    - (void)animationDidStart:(CAAnimation *)anim{
        NSLog(@"START");
    }
    
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
        //如果不通过动画事务将隐式动画关闭,会出现动画运行完毕后会从起点突变到终点。
        [CATransaction begin];
        [CATransaction setDisableActions:YES];
        self.layer.position = [[anim valueForKey:@"KPOINT"] CGPointValue];
        [CATransaction commit];
    }
    

    不更改透明度

    更改了透明度

    Tip: When creating an explicit animation, it is recommended that you always assign a value to the fromValue property of the animation object. If you do not specify a value for this property, Core animation uses the layer’s current value as the starting value. If you already updated the property to its final value, that might not yield the results you want.

    显式动画,apple建议你总是给fromValue赋值,如果你不赋值给fromValue,系统会取当前的属性值作为起始点,如果你更新了最终值,可能会得到意向不到的结果(不是很明白它的意思,我的理解是如果没更改最终值,这个属性是不会被动画改变的,动画只是视觉上的效果,原因见下)。

    Unlike an implicit animation, which updates the layer object’s data value, an explicit animation does not modify the data in the layer tree. Explicit animations only produce the animations. At the end of the animation, Core Animation removes the animation object from the layer and redraws the layer using its current data values. 隐式动画会直接改变该属性的值,而显式动画只是一个动画效果,Core Animation会根据属性的最终值重回layer,所有必须在动画结束之后手动更改属性值,除非你不想改变该属性。

    2.2 多个动画组合

    实现移动过程中旋转的动画效果:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        CGPoint p = [[touches anyObject] locationInView:self.view];
        CALayer *layer = self.leftBottomView.layer;
        self.layer = layer;
        //添加动画
        [self positionLayer:layer position:p];
        [self rotate:layer];
    }
    
    -(void)rotate:(CALayer *)layer{
        CABasicAnimation *basicAnimation=[CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        basicAnimation.toValue=[NSNumber numberWithFloat:M_PI_2*3];
        basicAnimation.duration=3.0;
        //添加动画到图层,注意key相当于给动画进行命名,以后获得该动画时可以使用此名称获取
        [layer addAnimation:basicAnimation forKey:@"KCBasicAnimation_Rotation"];
    }
    -(void)positionLayer:(CALayer *)layer position:(CGPoint)p{
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
        animation.toValue = [NSValue valueWithCGPoint:p];
        animation.duration = 3;
        animation.delegate = self;
        [animation setValue:[NSValue valueWithCGPoint:p] forKey:@"KPOINT"];
        [layer addAnimation:animation forKey:@"KPOSITION"];
    }
    
    - (void)animationDidStart:(CAAnimation *)anim{
        NSLog(@"START");
        [self.layer animationForKey:@"KPOSITION"];
    }
    
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
        [CATransaction begin];
        [CATransaction setDisableActions:YES];
        self.layer.position = [[anim valueForKey:@"KPOINT"] CGPointValue];
        [CATransaction commit];
    }
    

    多个动画结合

    三、关键帧动画(CAKeyFramedAnimation)

    3.1 关键帧动画简单实现

    CABasicAnimation只能设定初始和最终值,动画也只能是简单的从一个值到另一个值的变化。CAKeyFramedAnimation能够通过改变多个值,让你们的动画能够以线性或者非线性的方式展现。可以把keyFramedAnimation看成是许多个basicAnimation组合而成,每两个变化值之间的动画看成一个简单动画。

    以改变layer的position为例通过设置关键帧,做出曲线动画,它会根据设定的path值(pathCGPathRef类型),通过描绘路径进行关键帧动画控制:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        CGPoint p = [[touches anyObject] locationInView:self.view];
        CALayer *layer = self.leftBottomView.layer;
        self.layer = layer;
        //开始动画
        [self keyFramed:layer];
        //动画结束之后改变layer位置
        layer.position = CGPointMake(layer.position.x, layer.position.y+200);
    }
    
    -(void)keyFramed:(CALayer *)layer{
        CAKeyframeAnimation *keyFramedAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        //创建路径
        CGMutablePathRef path = CGPathCreateMutable();
        CGFloat x = layer.position.x;
        CGFloat y = layer.position.y;
        //添加贝塞尔曲线路径
        CGPathMoveToPoint(path, nil, x, y);
        CGPathAddCurveToPoint(path, nil, x+200, y, x+200, y+100, x, y+100);
        CGPathAddCurveToPoint(path, nil, x+200, y+100, x+200, y+200, x, y+200);
        keyFramedAnimation.path = path;
        keyFramedAnimation.duration = 5;
        [layer addAnimation:keyFramedAnimation forKey:@"KEYFRAME"];
    }
    

    keyFrameAnimation

    3.2 其他属性解析

    • calculationMode:

    The calculationMode property defines the algorithm to use in calculating the animation timing. The value of this property affects how the other timing-related properties are used

    calculationMode,动画计算模式,规定了动画时间的算法,对与时间有关的动画属性起作用。它是一个字符串类型,有如下:

    //线性动画,是计算模式的默认值
    kCAAnimationLinear
    //离散动画,每帧之间没有过渡
    kCAAnimationDiscrete
    //均匀动画,会忽略keyTimes
    kCAAnimationPaced
    //平滑执行
    kCAAnimationCubic
    //平滑均匀执行
    kCAAnimationCubicPaced
    

    各个值的动画效果示意图:

    calculationMode示意图

    • keyTimes: > The keyTimes property specifies time markers at which to apply each keyframe value

    keyTimes用于设置每帧之间的动画执行时间,但是只有在calculationModeKCAAnimationLinearKCAAnimationDiscrete KCAAnimationCubic的时候才有效。

    改变keyTimes来改变每帧的动画时间:

    CAKeyframeAnimation *keyFramedAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        CGMutablePathRef path = CGPathCreateMutable();
        CGFloat x = layer.position.x;
        CGFloat y = layer.position.y;
        CGPathMoveToPoint(path, nil, x, y);
        CGPathAddCurveToPoint(path, nil, x+200, y, x+200, y+100, x, y+100);
        CGPathAddCurveToPoint(path, nil, x+200, y+100, x+200, y+200, x, y+200);
        keyFramedAnimation.path = path;
        keyFramedAnimation.duration = 5;
        keyFramedAnimation.calculationMode = kCAAnimationCubicPaced;
        keyFramedAnimation.keyTimes = @[@0.0,@0.2,@1.0];
        [layer addAnimation:keyFramedAnimation forKey:@"KEYFRAME"];
    

    keytime

    四、动画组

    CABasicAnimation和CAKeyFramedAnimatio一次只能改变一个属性,显示开发中要实现的动画效果一般都是多个动画一起执行的,比如平移过程中加入旋转效果等等。通过CAAnimationGroup能让开发者自由组合多个动画效果。

    动画组的实现并不复杂,只需要将各个动画创建好再添加到动画组内就行了。

    来给上面的关键帧动画加上旋转效果试试:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        CGPoint p = [[touches anyObject] locationInView:self.view];
        CALayer *layer = self.leftBottomView.layer;
    
        CAAnimationGroup *group = [CAAnimationGroup animation];
        CAKeyframeAnimation *key = [self createKeyFramed:layer];
        CABasicAnimation *rotate = [self createRotate:layer];
        group.animations = @[key,rotate];
        [layer addAnimation:group forKey:@"GROUP"];
    
        layer.position = CGPointMake(layer.position.x, layer.position.y+200);
    }
    
    
    -(CAKeyframeAnimation *)createKeyFramed:(CALayer *)layer{
        CGFloat x = layer.position.x;
        CGFloat y = layer.position.y;
    
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathMoveToPoint(path, nil, x, y);
        CGPathAddCurveToPoint(path, nil, x+200, y, x+200, y+100, x, y+100);
        CGPathAddCurveToPoint(path, nil, x+200, y+100, x+200, y+200, x, y+200);
       
        CAKeyframeAnimation *keyFramedAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        keyFramedAnimation.path = path;
        keyFramedAnimation.duration = 5;
        [layer addAnimation:keyFramedAnimation forKey:@"KEYFRAME"];
        return keyFramedAnimation;
    }
    
    -(CABasicAnimation *)createRotate:(CALayer *)layer{
        CABasicAnimation *rotate=[CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        rotate.toValue =[NSNumber numberWithFloat:M_PI_2*3];
        rotate.duration =5.0;
        [layer addAnimation:rotate forKey:@"KCBasicAnimation_Rotation"];
        return rotate;
    }
    

    GROUP

    官方文档给的示例代码:

    // Animation 1
    CAKeyframeAnimation* widthAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderWidth"];
    NSArray* widthValues = [NSArray arrayWithObjects:@1.0, @10.0, @5.0, @30.0, @0.5, @15.0, @2.0, @50.0, @0.0, nil];
    widthAnim.values = widthValues;
    widthAnim.calculationMode = kCAAnimationPaced;
     
    // Animation 2
    CAKeyframeAnimation* colorAnim = [CAKeyframeAnimation animationWithKeyPath:@"borderColor"];
    NSArray* colorValues = [NSArray arrayWithObjects:(id)[UIColor greenColor].CGColor,
                (id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor,  nil];
    colorAnim.values = colorValues;
    colorAnim.calculationMode = kCAAnimationPaced;
     
    // Animation group
    CAAnimationGroup* group = [CAAnimationGroup animation];
    group.animations = [NSArray arrayWithObjects:colorAnim, widthAnim, nil];
    group.duration = 5.0;
     
    [myLayer addAnimation:group forKey:@"BorderChanges"];
    

    五、转场动画(CATransition)

    转场动画会为layer的转换添加一个视觉效果,最常见的是一个layer的消失和另一个layer的出现。

    CATransition

    子类型:

    CATransition

    CATransition* transition = [CATransition animation];
    transition.startProgress = 0;
    transition.endProgress = 1.0;
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromRight;
    transition.duration = 1.0;
     
    // Add the transition animation to both layers
    [myView1.layer addAnimation:transition forKey:@"transition"];
    [myView2.layer addAnimation:transition forKey:@"transition"];
     
    // Finally, change the visibility of the layers.
    myView1.hidden = YES;
    myView2.hidden = NO;
    

    六、暂停和继续动画

    在iOS动画时间是动画十分重要的一部分,Core Animation 通过调用 CAMediaTiming协议的属性和方法来精确的设定时间信息。

    However, the local time of a layer can be modified by its parent layers or by its own timing parameters. For example, changing the layer’s speed property causes the duration of animations on that layer (and its sublayers) to change proportionally

    每个动画都有自己的local time,用来管理动画时间信息。通常两个layer的local time是十分接近的,因此开发者不必去关心这方面的事情,但是改变了layer的speed属性的话就会导致动画的时间周期改变,从而影响各个layer动画local time。

    beginTime指定了动画开始之前的的延迟时间。这里的延迟从动画添加到可见图层的那一刻开始测量,默认是0(就是说动画会立刻执行)。

    speed是一个时间的倍数,默认1.0,减少它会减慢图层/动画的时间,增加它会加快速度。如果2.0的速度,那么对于一个duration为1的动画,实际上在0.5秒的时候就已经完成了。

    timeOffset和beginTime类似,但是和增加beginTime导致的延迟动画不同,增加timeOffset只是让动画快进到某一点,例如,对于一个持续1秒的动画来说,设置timeOffset为0.5意味着动画将从一半的地方开始。

    和beginTime不同的是,timeOffset并不受speed的影响。所以如果你把speed设为2.0,把timeOffset设置为0.5,那么你的动画将从动画最后结束的地方开始,因为1秒的动画实际上被缩短到了0.5秒。然而即使使用了timeOffset让动画从结束的地方开始,它仍然播放了一个完整的时长,这个动画仅仅是循环了一圈,然后从头开始播放。

    Core Animation的 马赫时间 ,可以使用CACurrentMediaTime来访问,它返回了设备自从上次启动到现在的时间(然而这并没什么卵用),它的真实作用在于对动画的时间测量提供了一个相对值。

    每个CALayer和CoreAnimation都有自己的本地时间概念,系统提供了两个方法:

    -(CFTimeInterval)convertTime:(CGTimeInterval)t fromLayer:(CALayer *)l;
    -(CFTimeInterval)convertTime:(CGTimeInterval)t toLayer:(CALayer *)l;
    

    配合父图层/动画图层关系中的beginTimetimeOff,speed,可以控制动画的暂停,快退/快进的功能:

    用一个小demo实现暂停、继续动画功能:

    - (void)pauseAnimation:(CALayer *)layer{
        CFTimeInterval pauseTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
        layer.timeOffset = pauseTime;
        layer.speed = 0;
    }
    
    - (void)resumeAnimation:(CALayer *)layer{
        CFTimeInterval pauseTime = [self.layer timeOffset];
        layer.timeOffset = 0;
        layer.beginTime = 0;
        layer.speed = 1;
        CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pauseTime;
        layer.beginTime = timeSincePause;
    }
    
    - (IBAction)pause:(id)sender {
        self.stop = !self.stop;
        if (self.stop) {
            [self animationResume];
        }else{
            [self animationPause];
        }
    }
    

    得到的效果 pause

    七、动画事务(CATransaction)

    CATransaction负责管理动画、动画组的创建和执行。大部分情况下开发者不需要手动创建trasaction(动画事务),但如果要更精确的控制动画的属性,比如duration,timing function等,就要通过手动创建CATrasaction。

    开启新的动画事务调用start方法,结束事务调用commit方法。

    apple给的简单示例代码,通过:

    [CATransaction begin];
    theLayer.zPosition=200.0;
    theLayer.opacity=0.0;
    [CATransaction commit];
    

    CATransaction通过block运行开发者在动画在动画结束之后执行一些其他操作:

    [CATransaction setCompletionBlock:^{
              //执行动画结束之后的操作
        }];
    

    CATransaction通过setValue:forKey来改变动画的属性,key值是使用的是系统提供的字符串类型值,以改变动画时间为例:

    [CATransaction begin];
    [CATransaction setValue:@10 forKey:kCATransactionAnimationDuration];
    [CATransaction comment];
    

    除了时间外还有:

    kCATransactionDisableActions
    kCATransactionAnimationTimingFunction
    kCATransactionCompletionBlock
    

    CATransaction允许一个事务内嵌套多个事务的操作,但是每个动画事务的begincommit必须配套使用。

    //outer transaction
    [CATransaction begin];
    CATransaction setValue:@2 forKey:kCATransactionAnimationDuration];
    layer.positon = CGPointMake(0,0);
    
    //inner transaction
    [CATransaction begin];
    [CATranscation setValue:@3 forKey:kCATransactionAnimationDuration];
    layer.zPosition = 200;
    layer.opacity = 0;
    //inner transaction completed
    [CATransaction commit];
    
    //outer transaction completed
    [CATranscation commit]
    展开全文
  • Animation学习笔记

    万次阅读 2020-04-22 00:02:36
    Animation的学习 1. Animation基本用法 <!--由@keyframes来定义新的animation动作--> @keyframes animation1{ 0%{ transform:translate(100px,200px); } 100%{ transform:translate(0px,0px); } } @...

    Animation的学习

    1. Animation基本用法

    <!--由@keyframes来定义新的animation动作-->
    
    @keyframes animation1{
    	0%{
    		transform:translate(100px,200px);
    	}
    	100%{
    		transform:translate(0px,0px);
    	}
    }
    
    @keyframes animation2{
    	0%{
    		transform:translate(100px,200px);
    	}
    	100%{
    		transform:translate(0px,0px);
    	}
    }
    
    <!--
    在需要引入的组件中设置animation属性,
    若存在多个animation属性重叠,后面的权重更大
    -->
    
    div{
    	animation-name:animation1,animation2;
    	animation-duration:4s,2s;
    }
    

    2. Animation属性

    animation-name	//名称
    animation-duration	//动画持续时间
    animation-delay	//延时开始动画
    animation-fill-mode	//动画结束后的行为,forwards(保持最后一个属性),backwards(应用第一个属性),both(前后两个都应用),none
    animation-iteration-count	//infinite(无限),n(次数)
    animation-timing-function	//linear,ease,ease-in,ease-out,ease-in-out,cubic-bezier(n,n,n,n),steps(n,start/end)
    animation-direction	//normal,reverse,alternate(慢慢回到起始点),alternate-reverse
    animation-play-state	//paused,running
    

    3. cubic-bezier()

    cubic-bezier是一种控制动画运动速率的曲线,
    推荐官网:www.cubic-bezier.com
    
    <!--属性值-->
    cubic-bezier(x1,y1,x2,y2)	//分别对应下图的p1和p2点
    

    图源菜鸟教程

    在这里插入图片描述

    展开全文
  • 通过 AnimationState.Speed 修改速度后,AnimationState.clip.length 这个值是不会修改的,只不过 AnimationState.time 值会变化很快

    通过 AnimationState.Speed 修改速度后,AnimationState.clip.length 这个值是不会修改的,只不过 AnimationState.time 值会变化很快

    展开全文
  • Animation动画

    万次阅读 2015-11-12 01:22:00
    首先介绍一下Animation: 1.Animation 动画类型 Android的animation由四种类型组成: XML中 alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转...
  • Android 属性动画(Property Animation) 完全解析 (上)

    万次阅读 多人点赞 2014-07-25 09:34:10
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/380674751、概述Android提供了几种...View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如
  • AnimationController

    2020-10-16 17:45:01
    需求:通过AnimationController实现控件平移动画效果。 核心代码: class RowState extends State<Row> with TickerProviderStateMixin{ double paddingLeft = 150; AnimationController animation...
  • TweenAnimation和PropertyAnimation TweenAnimation通过改变canvas的martix来实现动画,在View的draw过程中调用Animation.getTransformation获得动画 PropertyAnimation直接设置View的属性值,因为随Property...
  • animation属性

    2019-06-24 11:32:40
    animation属性是一个简写属性,用于设置6个动画属性 animation-name 描写动画的名称,规定需要绑定到选择器的 keyframe 名称。。 animation-duration 动画运行的时间 animation-timing-function 动画运行的方式 ...
  • CSS animation

    万次阅读 2017-06-08 22:00:02
    CSS animation
  • Animation & Property Animation 使用

    千次阅读 2016-05-17 17:40:27
    本篇主要讲Animation 和 Property Animation的使用,最后会讲QQ管家桌面火箭作为例子:在Android中开发动效有两套框架可以使用,分别为 Animation 和 Property Animation;相对来说,Animator比Animation要强大太多...
  • animation动画库 + animation用法

    千次阅读 2018-09-10 05:43:24
    1. animation.css https://daneden.github.io/animate.css/ 简单使用时,f12 审查元素 .cls 就可以查找对应的animation。 这个库最简单。 2. hover.css  http://ianlunn.github.io/Hover/ f12审查元素,选中...
  • animationClip 动画剪辑,用来播放动画; AnimationEvent 类似于SendMessage让你调用一个脚本函数,这个脚本是动画播放的一部分。动画事件函数支持0参数或一个参数,参数可以是浮点型,字符串,object或Animation...
  • Animation 组件

    2018-03-25 09:46:56
    Animation概述 Animation 组件,Animation类 //测试的结果是: //1、特别注意 XXQueue 这样的函数,如果遇到循环播放的动画 WrapMode.Loop , 因为默认情况 QueueMode.CompleteOthers,所以无法切换到其他动画...
  • Animation分解

    千次阅读 2016-05-18 14:00:34
    下面是一段分解animation的代码,具体的接口功能参见api static AnimationClip RebuildAniClip(AnimationClip aniClip, bool bUseScale) { AnimationClip newClip = null; EditorCurveBinding[] ...
  • Animation API

    2016-01-25 13:18:17
    Animation(示例,出错代码) 出处:Android API 作者:Android API 阅读:1320次 android.view.animationAnimation java.lang.Object android.view.animation.Animation 所有已实现的接口:Cloneable ...
  • AnimationTree类

    2019-10-22 16:04:51
    Godot Engine 3.2 Alpha2 AnimationTree继承于Node 常用方法 类型 方法名 说明
  • 动画animation

    2015-09-16 13:18:57
    动画确定产生动画效果的帧名 - animation-name 定义关键帧名 - animation-name:<single-animation-name> [',' <single-animation-name>]* <single-animation-name> = none | <ID
  • AnimationCurve

    千次阅读 2017-04-25 16:54:30
    关于animationCurve的使用总结 1 创建,可以新建脚本,创建animationCurve变量,然后直接在脚本上手动拖动可视化创建曲线,也可以用代码创建(这种比较不直观) 2 使用,anim.Evaluate(Time.time) 3 存储,编辑器...
  • Android属性动画property animation

    万次阅读 2019-11-26 21:42:40
    属性动画property animation 基于底部导航模板BottomNavigation的实现 https://blog.csdn.net/BLU_111/article/details/103257206 Step1 1.通过res—New—Vector Asset创建图片资源:ic_mood_black_24dp.xml 2....
  • Android Animation

    2014-03-04 13:48:30
    Android Animation
  • Spring Animation

    2015-12-26 21:10:25
    Spring Animation 简介Spring Animation 本质上是一种特殊的动画曲线,自从 iOS 7 开始被广泛应用在系统动画中。下图中演示的自带的动画效果实际上都使用了 Spring Animation: 事实上,从 iOS 7 起几乎所有的系统...
  • 原创Blog,转载请注明出处 blog.csdn.net/hello_hwc前言:本文主要包括以下几部分 UIDynamic Animation是什么 ...由于都是动画,我就把这部分放在了Core Animation中了,严格意义上来说,它是Core Animation
  • AnimationClip 动态添加 AnimationEvent /* 添加事件 */ private void AddEvent() { var animClip = Resources.Load&lt;AnimationClip&gt;("Test.fbx"); if (animClip != null) { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,096
精华内容 22,438
关键字:

animation