大家好,如果您还对动画实战教程系列之一不太了解,没有关系,今天就由本站为大家分享动画实战教程系列之一的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
今天我们将为爱奇艺实现一个加载动画效果。总体思路如下:
1、画一个三角形,并在其上播放两次旋转的动画;
2、画一个98%的圆环,先播放正向轨迹动画,然后在其上播放反向轨迹动画。
效果是这样
加载.gif
No code no bibi
SZPlayLoadingView.h文件
#import@interface SZPlayTriangleView : UIView
@结尾
@interface SZPlayLoadingView : UIView
- (void)显示加载中;
@end
SZPlayLoadingView.m文件
#import "SZPlayLoadingView.h"
static NSString * const kCircleAnimationName=@"circleAnimationEnd";
static NSString * const kCircleHideAnimationName=@"circleAnimationStart";
static NSString * const kTrangleAnimationName=@"kTrangleAnimationName";
静态常量CGFloat kAnimationDuration=0.6;
@interface SZPlayTriangleView()
/** 三角形层*/
@property(非原子,强)CAShapeLayer *triangleLayer;
@结尾
@实现SZPlayTriangleView
- (void)layoutSubviews {
[超级布局子视图];
[_triangleLayer removeFromSuperlayer];
_triangleLayer=nil;
[self.layer addSublayer:self.triangleLayer];
}
- (CAShapeLayer *)triangleLayer {
如果(!_triangleLayer){
//1. 创建三角形路径
CGFloat宽度=self.frame.size.width*0.65;
CGFloat width2=宽度/(sqrt(3));
CGFloat centerX=self.frame.size.width/2;
CGFloat centerY=self.frame.size.width/2;
CGPoint PointA=CGPointMake(centerX+(宽度*(2/3.0)), centerY);
CGPoint PointB=CGPointMake(PointA.x-宽度, PointA.y-宽度2);
CGPoint PointC=CGPointMake(PointB.x, PointB.y+2*width2);
UIBezierPath *path=[UIBezierPath bezierPath];
[路径moveToPoint:PointA];
[路径addLineToPoint:PointB];
[路径addLineToPoint:PointC];
[路径关闭路径];
//2. 创建图层
_triangleLayer=[CAShapeLayer 图层];
_triangleLayer.path=路径.CGPath;
_triangleLayer.fillColor=[UIColor colorWithRed:0.52f green:0.76f blue:0.07f alpha:1.00f].CGColor;
}
返回_triangleLayer;
}
@结尾
@interface SZPlayLoadingView()/** 圆形视图*/
@property(非原子,强)CAShapeLayer *circleLayer;
/** 圆形视图动画*/
@property(非原子,强)CABasicAnimation *circleLayerAnimation;
/** 圆形视图隐藏动画*/
@property(非原子,强)CABasicAnimation *circleLayerHideAnimation;
/** 三角形*/
@property(非原子,强)SZPlayTriangleView *triangleView;
/** 三角形动画*/
@property(非原子,强)CABasicAnimation *triangleAnimation;
@结尾
@实现SZPlayLoadingView
#pragma mark - 外部方法
- (void)showLoading {
[自我展示圈];
}
#pragma mark - 内部方法
- (void)showCircle {
[_circleLayer 移除所有动画];
[_triangleView 从Superview 删除];
[自我addSubview:self.triangleView];
[self.layer addSublayer:self.circleLayer];
self.circleLayer.linesStart=0;
self.circleLayer.linesEnd=0.98;
[self.circleLayer addAnimation:self.circleLayerAnimation forKey:kCircleAnimationName];
}
- (void)hideCircle {
self.circleLayer.linesStart=0.98;
[self.circleLayer addAnimation:self.circleLayerHideAnimation forKey:kCircleHideAnimationName];
}
- (void)showTriangleAmimation {
[self.triangleView.layer addAnimation:self.triangleAnimation forKey:kTrangleAnimationName];
}
#pragma mark - 动画委托
- (void)animationDidStop:(CAAnimation *)anim finish:(BOOL)flag {
if ([[anim valueForKey:@"animationName"] isEqualToString:kCircleHideAnimationName]) {
[self.triangleView.layer 移除所有动画];
[自我展示圈];
} else if ([[anim valueForKey:@"animationName"] isEqualToString:kCircleAnimationName]) {
[自我展示TriangleAmimation];
[自我隐藏圆圈];
}
}
#pragma mark - 属性
- (CAShapeLayer *)circleLayer {
如果(!_circleLayer){
_circleLayer=[CAShapeLayer 图层];
//1.设置路径
UIBezierPath *circlePath=[UIBezierPath bezierPathWithOvalInRect:self.bounds];
_circleLayer.path=circlePath.CGPath;
//2.设置颜色
_circleLayer.fillColor=[UIColorclearColor].CGColor;
_circleLayer.linesColor=[UIColor colorWithRed:0.52 green:0.76 blue:0.07 alpha:1].CGColor;
//3. 设置线宽和线帽
_circleLayer.lineWidth=1;
_circleLayer.lineCap=kCALineCapRound;
//4. 设置翻转
_circleLayer.transform=CATransform3DRotate(_circleLayer.transform, -M_PI_2, 0, 0, 1);
_circleLayer.transform=CATransform3DTranslate(_circleLayer.transform, -self.bounds.size.width, 0, 0);
}
返回_circleLayer;
}
- (CABasicAnimation *)circleLayerAnimation {
if (!_circleLayerAnimation) {
_circleLayerAnimation=[CABasicAnimationanimationWithKeyPath:@"strikeEnd"];
_circleLayerAnimation.fromValue=@(0);
_circleLayerAnimation.duration=kAnimationDuration;
[_circleLayerAnimation setValue:kCircleAnimationName forKey:@"animationName"];
_circleLayerAnimation.delegate=self;
}
返回_circleLayerAnimation;
}
- (CABasicAnimation *)circleLayerHideAnimation {
if (!_circleLayerHideAnimation) {
_circleLayerHideAnimation=[CABasicAnimationanimationWithKeyPath:@"行程开始"];
_circleLayerHideAnimation.fromValue=@(0);
_circleLayerHideAnimation.duration=kAnimationDuration;
[_circleLayerHideAnimation setValue:kCircleHideAnimationName forKey:@"animationName"];
_circleLayerHideAnimation.delegate=self;
}
返回_circleLayerHideAnimation;
}
- (SZPlayTriangleView *)triangleView {
如果(!_triangleView){
_triangleView=[SZPlayTriangleView 新];
_triangleView.frame=CGRectMake(0, 0, self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
_triangleView.center=CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
_triangleView.backgroundColor=[UIColor 清除颜色];
}
返回_triangleView;
}
- (CABasicAnimation *)triangleAnimation {
if (!_triangleAnimation) {
_triangleAnimation=[CABasicAnimationanimationWithKeyPath:@"transform.rotation.z"];
_triangleAnimation.toValue=@(M_PI * 2);
_triangleAnimation.duration=kAnimationDuration;
[_triangleAnimation setValue:kTrangleAnimationName forKey:@"animationName"];
}
返回_triangleAnimation;
}
动画实战教程系列之一和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【动画实战教程系列之一】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于等到动画实战了!
有14位网友表示赞同!
期待学习实际操作经验~
有11位网友表示赞同!
要看哪些案例啊?能分享一些吗?
有15位网友表示赞同!
我还没学会基本原理,这集教程适合什么水平?
有10位网友表示赞同!
希望这次动画设计可以学到真技能!
有8位网友表示赞同!
三部曲第一个呢,后面还有很多精彩?
有6位网友表示赞同!
这个动画实战课程有难度吗?
有18位网友表示赞同!
一定要讲到软件操作技巧吧!
有9位网友表示赞同!
我比较想了解动画的原理,这集会不会讲?
有14位网友表示赞同!
视频教程方便学习,而且很视觉直接...
有9位网友表示赞同!
希望这次实战课程能从头开始讲解!
有11位网友表示赞同!
终于可以动手试练一下了~
有5位网友表示赞同!
三部曲的每一系列都有所不同吗?
有15位网友表示赞同!
感觉这个动画实战内容很实用,报名去!
有8位网友表示赞同!
期待课程里能分享制作技巧!
有20位网友表示赞同!
我准备好好跟着视频学习一遍!
有5位网友表示赞同!
三部分的衔接会比较紧密吗?
有20位网友表示赞同!
这集动画实战会不会讲解几种常用风格?
有19位网友表示赞同!
学习完这个课程,我能自己制作动画吗?
有8位网友表示赞同!
我要去看看视频内容是什么样的!
有17位网友表示赞同!