• iOS 动画组


      其实早在一个多月以前就已经实现了动作组播放的功能,不过当时感觉好像没有什么难度并没有放在心上,今天突然要用到动画组,发现已经忘记了,所以又将原来的代码翻出来看了下。最后决定还是写下来,以备不时之需。动画组播放很简单,使用的是CAAnimationGroup这个类,将不同的动画添加到里面进行播放。通常可以添加的动画有:1、keyPath,它用来绘制路径,直线或者曲线,从理论上讲任意的线都可以绘制;2、旋转动画,它可以绕x、y、z轴进行旋转;3、缩放动画。

      废话不多说,直接上代码。

      

     1 #define pathAnimation @"position"
     2 #define transformX @"transform.rotation.x"
     3 #define transformY @"transform.rotation.y"
     4 #define transformZ @"transform.rotation.z"
     5 #define scaleAnimation @"position scale"
     6 #import <Foundation/Foundation.h>
     7 #import <QuartzCore/QuartzCore.h>
     8 #import <UIKit/UIKit.h>
     9 
    10 //NSString *const pathAnimation = @"position";          //运动轨迹
    11 //NSString *const transformX = @"transform.rotation.x"; //绕x轴旋转
    12 //NSString *const transformY = @"transform.rotation.y"; //绕y轴旋转
    13 //NSString *const transformZ = @"transform.rotation.z"; //绕z轴旋转
    14 //NSString *const scaleAnimation = @"position scale";   //缩放
    15 
    16 typedef enum AnimationType{
    17     KeyPathAnimation,      //运动轨迹为抛物线
    18     RotationAnimationX,    //绕x轴旋转
    19     RotationAnimationY,    //绕y轴旋转
    20     RotationAnimationZ,    //绕z轴旋转
    21     ScaleAnimation         //缩放
    22 }AnimationType;
    23 
    24 @protocol LMFThowingLineToolDelegate <NSObject>
    25 
    26 - (void)animationDidFinish;
    27 
    28 @end
    29 
    30 @interface LMFThowingLineTool : NSObject
    31 @property (nonatomic, strong) NSMutableArray *typeArray;//用来存储动画类型
    32 @property (nonatomic, strong) NSArray *pointArray;
    33 @property (nonatomic, strong) CAKeyframeAnimation *keyFrameAnimation;
    34 @property (nonatomic, strong) CABasicAnimation *basicAnimation;
    35 @property (nonatomic, strong) UIView *showView;
    36 @property (nonatomic, assign) CGFloat duration;
    37 @property (nonatomic, assign) id<LMFThowingLineToolDelegate> delegate;
    38 - (void)setPointArray:(NSArray *)pointArray;
    39 - (void)setDuration:(CGFloat)duration;
    40 - (void)setKeyFrameAnimation;
    41 - (void)setBasicAnimationWith:(AnimationType)animationType;
    42 - (void)thowingView:(UIView *)view;
    43 - (void)setTransform:(CGFloat)angle and:(AnimationType)animationType;
    44 @end

      实现类:

     

      1 #import "LMFThowingLineTool.h"
      2 #import "LMFPoint.h"
      3 
      4 @interface LMFThowingLineTool ()
      5 
      6 @end
      7 
      8 @implementation LMFThowingLineTool
      9 
     10 - (void)dealloc
     11 {
     12     self.basicAnimation = nil;
     13     self.keyFrameAnimation = nil;
     14     NSLog(@"%@", self.basicAnimation);
     15 }
     16 
     17 - (instancetype)init
     18 {
     19     if (self = [super init])
     20     {
     21         self.typeArray = [NSMutableArray array];
     22     }
     23     return self;
     24 }
     25 - (void)setPointArray:(NSArray *)pointArray
     26 {
     27     _pointArray = pointArray;
     28 }
     29 - (void)setDuration:(CGFloat)duration
     30 {
     31     _duration = duration;
     32 }
     33 - (void)setKeyFrameAnimation
     34 {
     35     if ([self.pointArray count] == 0)
     36     {
     37         return;
     38     }
     39     CGMutablePathRef path = CGPathCreateMutable();
     40     
     41     if ([self.pointArray count] == 3)
     42     {
     43         LMFPoint * startPoint = (LMFPoint *)self.pointArray[0];
     44         LMFPoint * centerPoint = (LMFPoint *)self.pointArray[1];
     45         LMFPoint * endPoint = (LMFPoint *)self.pointArray[2];
     46         CGPathMoveToPoint(path, NULL, startPoint.x, startPoint.y);
     47         //这里用的直线的路径,也可以设置抛物线,获取曲线,可进行自定义
     48         CGPathAddQuadCurveToPoint(path, NULL, centerPoint.x, centerPoint.y, endPoint.x, endPoint.y);
     49     }
     50     else if ([self.pointArray count] > 3)
     51     {
     52         return;
     53     }
     54     self.keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:pathAnimation];
     55     self.keyFrameAnimation.path = path;
     56     CFRelease(path);
     57     [self.typeArray addObject:self.keyFrameAnimation];
     58 }
     59 - (void)setTransform:(CGFloat)angle and:(AnimationType)animationType
     60 {
     61     
     62 }
     63 - (void)setBasicAnimationWith:(AnimationType)animationType
     64 {
     65     self.basicAnimation = [[CABasicAnimation alloc] init];
     66     self.basicAnimation.autoreverses = YES;
     67     self.basicAnimation.repeatCount = MAXFLOAT;
     68     self.basicAnimation.duration = self.duration;
     69     switch (animationType) {
     70         case RotationAnimationX:
     71             self.basicAnimation.keyPath = transformX;
     72             break;
     73         case RotationAnimationY:
     74             self.basicAnimation.keyPath = transformY;
     75             break;
     76         case RotationAnimationZ:
     77             self.basicAnimation.keyPath = transformZ;
     78             break;
     79         case ScaleAnimation:
     80             self.basicAnimation.keyPath = scaleAnimation;
     81             self.basicAnimation.toValue = [NSNumber numberWithFloat:(CGFloat)((arc4random() % 4) + 4) / 10.0];
     82             [self.typeArray addObject:self.basicAnimation];
     83             break;
     84         default:
     85             break;
     86     }
     87     self.basicAnimation.fromValue = [NSNumber numberWithFloat:0.0];
     88     int intNumber = arc4random()%3+1;
     89     self.basicAnimation.toValue = [NSNumber numberWithFloat:intNumber*M_PI];
     90     [self.typeArray addObject:self.basicAnimation];
     91 }
     92 
     93 #pragma mark --开始执行动画
     94 - (void)thowingView:(UIView *)view
     95 {
     96     self.showView = view;
     97     CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
     98 //    groupAnimation.delegate = self;
     99     groupAnimation.repeatCount = 1;
    100     groupAnimation.duration = self.duration;
    101     groupAnimation.removedOnCompletion = NO;
    102     groupAnimation.animations = self.typeArray;
    103     [view.layer addAnimation:groupAnimation forKey:@"position scale"];
    104 }
    105 
    106 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
    107 {
    108     [self.showView removeFromSuperview];
    109     self.showView = nil;
    110 }
    111 
    112 @end

      额外需要的类:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    @interface LMFPoint : NSObject
    @property (nonatomic, assign) CGFloat x;
    @property (nonatomic, assign) CGFloat y;
    - (instancetype)initWith:(CGFloat)x and:(CGFloat)y;
    @end
    
    #import "LMFPoint.h"
    
    @implementation LMFPoint
    - (instancetype)initWith:(CGFloat)x and:(CGFloat)y
    {
        if (self = [super init])
        {
            self.x = x;
            self.y = y;
        }
        return self;
    }
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"x:%f   y:%f", self.x, self.y];
    }
    
    @end
  • 相关阅读:
    TCP系列49—拥塞控制—12、DSACK下的拥塞撤销
    TCP系列48—拥塞控制—11、FRTO拥塞撤销
    TCP系列47—拥塞控制—10、FACK下的快速恢复与PRR
    TCP系列46—拥塞控制—9、SACK下的快速恢复与Limited transmit
    TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
    使用kdump内核调试工具遇到的问题及解决
    TCP系列44—拥塞控制—7、SACK关闭的快速恢复
    TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)
    RMAN 前期准备工作和实例
    RMAN 参数详解
  • 原文地址:https://www.cnblogs.com/lmfboke/p/5993664.html
Copyright © 2020-2023  润新知