Objective-C 使用核心动画CAAnimation实现动画
先来看看效果吧
整个核心动画就不多做介绍了,随便一搜就能有很多很详细的解释,主要使用以下四种
CABasicAnimation //经典动画
CAKeyframeAnimation //关键帧动画
CATransition //转场动画
CAAnimationGroup //组动画
分析下本次demo的动画构成
主要动画是对音频控制面板的操作。
- 分解
- 看做两个view 一个是播放面板的小圆 一个是整个控制面板
- 播放面板的曲线运动 使用核心动画中的
CAKeyframeAnimation
- 播放面板的变大缩小、控制面板消失出现 使用
CABasicAnimation
并加入组动画序列CAAnimationGroup
中 - 歌曲信息面板的消失和出现
bounds动画
对播放面板进行变大和变小,下面是变小,变大同理。
//startView变小
- (void)startViewChangeSmaller {
//设置一组动画
//变小
CABasicAnimation *animation1 = [[CABasicAnimation alloc] init];
animation1.keyPath = @"bounds";
animation1.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, kStartRadius*2, kStartRadius*2)];
//变圆
CABasicAnimation *animation2 = [[CABasicAnimation alloc] init];
animation2.keyPath = @"cornerRadius";
animation2.toValue = [NSNumber numberWithFloat:kStartRadius];
//加入组动画
CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
group.animations = @[animation1,animation2];
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
group.duration = kAnimationDuration;
group.delegate = self;
[self.startView.layer addAnimation:group forKey:nil];
self.layer.masksToBounds = YES;
[self performSelector:@selector(startViewBackAnimation) withObject:nil afterDelay:kAnimationDuration];
}
曲线动画
这里我们使用的是贝塞尔曲线 先说代码
//通过曲线路径将startView移到中间
- (void)startViewToCenter {
//设置贝塞尔曲线路径动画
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:self.startView.center];
[path addCurveToPoint:CGPointMake(self.frame.size.width/2, self.frame.size.height/2 ) controlPoint1:CGPointMake(self.frame.size.width - kStartRadius, 0 ) controlPoint2:CGPointMake(self.frame.size.width * 1.3, self.frame.size.height/2)];
CAKeyframeAnimation *anmiation0 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
anmiation0.path = path.CGPath;
anmiation0.duration = kAnimationDuration;
anmiation0.removedOnCompletion = NO;
anmiation0.fillMode = kCAFillModeForwards;
[self.startView.layer addAnimation:anmiation0 forKey:nil];
[self performSelector:@selector(startViewChangeAnimation) withObject:nil afterDelay:1];
}
这里就要提到贝塞尔曲线的控制点了,这里有个简单的方法去定义曲线。
- 打开PS 或者其他制图软件
- 使用钢笔画一条线,通过拖动控制点(锚点)就能更改成曲线的样子
- 二阶的贝塞尔曲线是有2个控制点
- 切换钢笔工具为锚点选择工具,我们来拖动锚点,让曲线变成你想要的样子
- 知道控制点的大概位置这样我们就能定义控制点坐标了。
最后的小贴士:view超出superview的范围了怎么办?
很简单给当前view添加一个响应函数
//响应超出view的事件
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return YES;
}
再试试看 超出部分的button也可以点击了!
Demo地址
https://github.com/gongxiaokai/CAAnimationDemo
Objective-C 使用核心动画CAAnimation实现动画的更多相关文章
- 核心动画 CAAnimation 进阶
转载自:http://www.cofcool.net/development/2015/06/20/ios-study-note-nine-CoreAnimation/ Core Animation, ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
- iOS开发UI篇—核心动画(转场动画和组动画)
转自:http://www.cnblogs.com/wendingding/p/3801454.html iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的 ...
- 核心动画基础动画(CABasicAnimation)关键帧动画
1.在iOS中核心动画分为几类: 基础动画(CABasicAnimation) 关键帧动画(CAKeyframeAnimation) 动画组(CAAnimationGroup) 转场动画(CATran ...
- iOS:核心动画之关键帧动画CAKeyframeAnimation
CAKeyframeAnimation——关键帧动画 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是: –CABasicAnimation只能 ...
- iOS:核心动画之基本动画CABasicAnimation
基本动画,是CAPropertyAnimation的子类 属性说明: fromValue:keyPath相应属性的初始值 toValue:keyPath相应属性的结束值 动画过程说明: 随着动画的进行 ...
- 核心动画(UIView封装动画)
一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...
- iOS核心动画以及UIView动画的介绍
我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...
- ios开发核心动画七:核心动画与UIView动画的区别
/** UIView与核心动画区别?(掌握) 1.核心动画只作用在layer. 2.核心动画看到的都是假像,它并没有去修改UIView的真实位置. 什么时候使用核心动画? 1.当不需要与用户进行交互, ...
随机推荐
- 每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解
本篇主要介绍MongoDB可视化操作以及shell使用及命令,备份恢复.数据导入导出. MongoVUE安装和简单使用 使用mongo.exe 管理数据库虽然可行,功能也挺强大,但每次都要敲命令,即繁 ...
- http服务器开发笔记(一)——先跑起来
做了很多年的web相关开发,从来也没有系统的学习http协议,最近正好工作不怎么忙,准备系统的学习一下. 接下来准备自己写一小型的http服务器来学习,因为现在对JavaScript比较熟悉,所以决定 ...
- 【转载】SQL Server行转列,列转行
行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...
- linux 下用renameTo方法修改java web项目中文件夹名称问题
经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...
- python 打印文件里的内容
>>> import os >>> os.chdir ('e:/')>>> data=open('text.txt')>>> f ...
- Codewars练习笔记·1 - 6.23
Codewars地址:https://www.codewars.com/ 笔记资料来源:JavaScript高级程序设计. 欢迎和大家一起来讨论~ 基础练习(1): 我的解答为: class ...
- 通过位异或来交换a,b的值和通过中间变量交换a,b的值
//通过位异或来交换a,b的值 #include <stdio.h> int main(int argc, const char * argv[]) { int a=20,b=10; ...
- nginx 配置https 负载均衡
1.Winodw安装openssl工具(生成SSL证书用的)免编译版本下载: http://slproweb.com/products/Win32OpenSSL.html 注意:如果openssl在使 ...
- 不让bat文件运行命令结束后cmd窗口自动关闭
方法1假设你的bat名字叫aaa.bat你可以新开一个bat,内容是start aaa.bat然后这个新的bat是不会自动关闭的 方法2要执行bat后不退出,可以在bat里的最后添加pause命令,暂 ...
- 【Android Developers Training】 81. 解析XML数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...