zoukankan      html  css  js  c++  java
  • Core Animation 动画的使用:关键帧动画、基础动画、动画组

    首先让我们了解下什么是 Core Animation,Core Animation 为核心动画,他为图形渲染和动画提供了基础。使用核心动画,我们只需要设置起点、终点、关键帧等一些参数,剩下的工作核心动画会自动帮我们处理。(学过 Flash 的朋友会有种似曾相识的感觉)

    核心动画开发动画的本质是将 CALayer 中的内容转换为位图从而供硬件操作,他不用消耗 CPU 资源,合理使用他能提高 App 性能。

    核心动画的几大核心类:

    CAAnimation「核心动画基类」:不能直接使用,他遵循并实现了 CAMediaTiming 协议,负责动画运行时间和速度的控制。

    CAPropertyAnimation「属性动画基类」:不能直接使用,他通过可动画属性进行动画设置。

    CAAnimationGroup「动画组」:他是一种组合模式,可以组合多个动画进行动画行为的统一控制。

    CATransition「转场动画」:主要通过滤镜进行动画效果设置。

    CABasicAnimation「基础动画」:通过起点和终点状态属性参数进行动画控制。

    CAKeyframeAnimation「关键帧动画」:同 CABasicAnimation 一样通过属性参数进行动画控制,但不同的是他可以有多个状态控制,不单单只有起点和终点。

    CABasicAnimation 和 CAKeyframeAnimation 都属于 CAPropertyAnimation,他们通过修改属性参数产生动画效果。在两个状态点中间过程的动画,可以称为「补间动画」,他由系统自动计算产生。CABasicAnimation 只有起点和终点状态,从某种角度来说,他相当于有两个关键帧的 CAKeyframeAnimation。

    下面让我们通过例子,了解如何使用 CAKeyframeAnimation「关键帧动画」、CABasicAnimation「基础动画」、CAAnimationGroup「动画组」吧。

    效果如下:

    ViewController.h

    1 #import <UIKit/UIKit.h>
    2 
    3 @interface ViewController : UIViewController
    4 @property (strong, nonatomic) IBOutlet UIImageView *imgVAnimation;
    5 @property (strong, nonatomic) IBOutlet UIButton *btnAnimation1;
    6 @property (strong, nonatomic) IBOutlet UIButton *btnAnimation2;
    7 
    8 @end

    ViewController.m

      1 #import "ViewController.h"
      2 
      3 @interface ViewController ()
      4 - (void)modifyLayerForButton:(UIButton *)btn;
      5 - (void)layoutUI;
      6 @end
      7 
      8 @implementation ViewController
      9 #define kCornerRadiusOfImage CGRectGetWidth(_imgVAnimation.frame)/2.0
     10 
     11 - (void)viewDidLoad {
     12     [super viewDidLoad];
     13     
     14     [self layoutUI];
     15 }
     16 
     17 - (void)didReceiveMemoryWarning {
     18     [super didReceiveMemoryWarning];
     19     // Dispose of any resources that can be recreated.
     20 }
     21 
     22 - (void)modifyLayerForButton:(UIButton *)btn {
     23     btn.layer.masksToBounds = YES;
     24     btn.layer.cornerRadius = 5.0;
     25     btn.layer.borderColor = [UIColor grayColor].CGColor;
     26     btn.layer.borderWidth = 1.0;
     27 }
     28 
     29 - (void)layoutUI {
     30     //图片视图
     31     _imgVAnimation.layer.masksToBounds = YES;
     32     _imgVAnimation.layer.cornerRadius = kCornerRadiusOfImage;
     33     _imgVAnimation.layer.borderColor = [UIColor orangeColor].CGColor;
     34     _imgVAnimation.layer.borderWidth = 2.0;
     35     
     36     //按钮
     37     [self modifyLayerForButton:_btnAnimation1];
     38     [self modifyLayerForButton:_btnAnimation2];
     39 }
     40 
     41 - (IBAction)btnAnimation1DidPush:(id)sender {
     42     //移到右下角;使用关键帧动画,移动路径为预定的贝塞尔曲线路径
     43     CGPoint fromPoint = _imgVAnimation.center;
     44     CGFloat toPointX = self.view.frame.size.width - kCornerRadiusOfImage;
     45     CGFloat toPointY = self.view.frame.size.height - kCornerRadiusOfImage;
     46     CGPoint toPoint = CGPointMake(toPointX, toPointY);
     47     CGPoint controlPoint = CGPointMake(toPointX, 0.0);
     48     
     49     UIBezierPath *path = [UIBezierPath bezierPath];
     50     [path moveToPoint:fromPoint];
     51     [path addQuadCurveToPoint:toPoint controlPoint:controlPoint];
     52     
     53     CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
     54     positionAnimation.path = path.CGPath;
     55     positionAnimation.removedOnCompletion = YES;
     56     
     57     //变小;使用基础动画
     58     CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
     59     transformAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
     60     transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; //设置 X 轴和 Y 轴缩放比例都为1.0,而 Z 轴不变
     61     transformAnimation.removedOnCompletion = YES;
     62     
     63     //透明;使用基础动画
     64     CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
     65     opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0];
     66     opacityAnimation.toValue = [NSNumber numberWithFloat:0.1];
     67     opacityAnimation.removedOnCompletion = YES;
     68     
     69     //组合效果;使用动画组
     70     CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
     71     animationGroup.animations = @[ positionAnimation, transformAnimation, opacityAnimation ];
     72     animationGroup.duration = 1.0; //设置动画执行时间;这里设置为1.0秒
     73     animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; //设置媒体调速运动;默认为 kCAMediaTimingFunctionLinear,即为线型间隔;这里设置为 kCAMediaTimingFunctionEaseIn,即先慢后快,相当于有个加速度
     74     animationGroup.autoreverses = YES; //设置自动倒退,即动画回放;默认值为NO
     75     [_imgVAnimation.layer addAnimation:animationGroup forKey:nil];
     76 }
     77 
     78 - (IBAction)btnAnimation2DidPush:(id)sender {
     79     //向右移动;使用关键帧动画,移动路径为预定的直线路径
     80     CGPoint fromPoint = _imgVAnimation.center;
     81     CGPoint toPoint = CGPointMake(fromPoint.x + 100.0, fromPoint.y);
     82     
     83     UIBezierPath *path = [UIBezierPath bezierPath];
     84     [path moveToPoint:fromPoint];
     85     [path addLineToPoint:toPoint];
     86     
     87     CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
     88     positionAnimation.path = path.CGPath;
     89     positionAnimation.removedOnCompletion = YES;
     90     
     91     //旋转;使用基础动画
     92     CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
     93     transformAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
     94     transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0)]; //设置沿着 Z 轴顺时针旋转90度;注意 CATransform3DMakeRotation 总是按最短路径来选择,当顺时针和逆时针的路径相同时(e.g. M_PI),会使用逆时针
     95     transformAnimation.repeatCount = 8.0; //设置动画播放重复次数;这里设置为8.0次,共720度
     96     transformAnimation.duration = 0.5; //设置动画执行时间;这里设置为0.5秒
     97     transformAnimation.cumulative = YES; //设置是否累积;默认值为NO,这里设置为YES,看起来才动画效果连贯
     98     transformAnimation.removedOnCompletion = YES;
     99     
    100     //组合效果;使用动画组
    101     CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    102     animationGroup.animations = @[ positionAnimation, transformAnimation ];
    103     animationGroup.duration = 4.0; //设置动画执行时间;这里设置为4.0秒
    104     animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; //设置媒体调速运动;默认为 kCAMediaTimingFunctionLinear,即为线型间隔;这里设置为 kCAMediaTimingFunctionEaseIn,即先慢后快,相当于有个加速度
    105     animationGroup.autoreverses = YES; //设置自动倒退,即动画回放;默认值为NO
    106     
    107     //以下两句是『动画结束后回到初始状态的现象』的解决方法;这里没用到
    108     //animationGroup.removedOnCompletion = NO; //设置是否完成后从对应的所属图层移除他,默认为YES
    109     //animationGroup.fillMode = kCAFillModeForwards; //设置动画填充模式;默认值为 kCAFillModeRemoved,即动画执行完就移除,变回原来的状态,这里设置为 kCAFillModeForwards,即保持向前的状态
    110     [_imgVAnimation.layer addAnimation:animationGroup forKey:nil];
    111 }
    112 
    113 @end

    Main.storyboard

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
     3     <dependencies>
     4         <deployment identifier="iOS"/>
     5         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
     6     </dependencies>
     7     <scenes>
     8         <!--View Controller-->
     9         <scene sceneID="ufC-wZ-h7g">
    10             <objects>
    11                 <viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController">
    12                     <layoutGuides>
    13                         <viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
    14                         <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
    15                     </layoutGuides>
    16                     <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
    17                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
    18                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
    19                         <subviews>
    20                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Emoticon_tusiji_icon2" translatesAutoresizingMaskIntoConstraints="NO" id="j2r-O5-Hj2">
    21                                 <rect key="frame" x="20" y="40" width="150" height="150"/>
    22                             </imageView>
    23                             <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aiO-kP-xCF">
    24                                 <rect key="frame" x="20" y="243" width="150" height="50"/>
    25                                 <state key="normal" title="移到右下角变小透明">
    26                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
    27                                 </state>
    28                                 <connections>
    29                                     <action selector="btnAnimation1DidPush:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="7Z2-yc-1vS"/>
    30                                 </connections>
    31                             </button>
    32                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="图片操作:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YH5-Oi-KEH">
    33                                 <rect key="frame" x="20" y="208" width="150" height="21"/>
    34                                 <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
    35                                 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
    36                                 <nil key="highlightedColor"/>
    37                             </label>
    38                             <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hSL-o5-Ism">
    39                                 <rect key="frame" x="20" y="311" width="150" height="50"/>
    40                                 <state key="normal" title="旋转并向右移动">
    41                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
    42                                 </state>
    43                                 <connections>
    44                                     <action selector="btnAnimation2DidPush:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="lC4-zx-uIb"/>
    45                                 </connections>
    46                             </button>
    47                         </subviews>
    48                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
    49                     </view>
    50                     <connections>
    51                         <outlet property="btnAnimation1" destination="aiO-kP-xCF" id="kSp-82-S2R"/>
    52                         <outlet property="btnAnimation2" destination="hSL-o5-Ism" id="6Mz-Wd-xfN"/>
    53                         <outlet property="imgVAnimation" destination="j2r-O5-Hj2" id="Gmp-iW-kaX"/>
    54                     </connections>
    55                 </viewController>
    56                 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
    57             </objects>
    58         </scene>
    59     </scenes>
    60     <resources>
    61         <image name="Emoticon_tusiji_icon2" width="150" height="150"/>
    62     </resources>
    63 </document>
  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4681660.html
Copyright © 2011-2022 走看看