废话不多说,先看上效果,由于动画录制的时候帧率限制,只能将动画放慢了进行录制,更容易看到效果

这是点击开始之后代码

-(IBAction)btnStartClick:(id)sender
{
CABasicAnimation *baseanimation1=[CABasicAnimation animationWithKeyPath:@"transform.scale.x"];
baseanimation1.fromValue=@(1.0f);
baseanimation1.toValue=@(20.0f/myview.frame.size.width); CABasicAnimation *baseanimation2=[CABasicAnimation animationWithKeyPath:@"transform.scale.y"];
baseanimation2.fromValue=@(1.0f);
baseanimation2.toValue=@(20.0f/myview.frame.size.height); CAAnimationGroup *cg=[CAAnimationGroup animation];
cg.duration=0.2;
cg.animations=@[baseanimation1,baseanimation2];
cg.repeatCount=0;
cg.delegate=self;
cg.removedOnCompletion=NO;
[myview.layer addAnimation:cg forKey:@"myviewscale"];
}

由于动画使由多个动画组成,所以第一个动画完毕之后自动再次开始一个动画

-(void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if(anim==[myview.layer animationForKey:@"myviewscale"])
{
myview.frame=CGRectMake((self.view.frame.size.width-20)/2,(self.view.frame.size.height-20)/2, 20, 20);
[myview.layer removeAnimationForKey:@"myviewscale"]; UIBezierPath *path=[UIBezierPath bezierPath];
[path moveToPoint:self.view.center];
[path addQuadCurveToPoint:CGPointMake(20, self.view.frame.size.height-20) controlPoint:CGPointMake(35, 50)]; CAKeyframeAnimation *keyframeanimation1=[CAKeyframeAnimation animationWithKeyPath:@"position"];
keyframeanimation1.path=path.CGPath;
keyframeanimation1.duration=1;
//keyframeanimation1.rotationMode = kCAAnimationRotateAuto;
keyframeanimation1.rotationMode = nil;
keyframeanimation1.delegate=self;
keyframeanimation1.removedOnCompletion=NO;
keyframeanimation1.fillMode = kCAFillModeForwards;
keyframeanimation1.timingFunction=[CAMediaTimingFunction functionWithControlPoints:0.3 :0.7 :0.7 :0.3];
[myview.layer addAnimation:keyframeanimation1 forKey:@"myviewposition"];
}
else
{
myview.frame=CGRectMake(10,self.view.frame.size.height-20, 20, 20);
[myview.layer removeAnimationForKey:@"myviewposition"];
}
}

先解释一下动画执行过程

第一步是通过CABasicAnimation 对照片进行缩放

第二步是通过CAKeyframeAnimation 对照片进行位移并最终产生抛物线的投掷效果

抛物线轨迹的实现

要想让动画有一个抛物线的轨迹就需要一个二次贝塞尔曲线的轨迹进行模拟,二次贝塞尔曲线如下,这里引用了一个网络的动画图片。

二次贝塞尔曲线中 p0 为起始点、p1 为控制点、 p2为结束点

UIBezierPath 的实例方法 addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;要求输入一个结束点(p2) 和 控制点(p1),然后这个函数将为我们自动构建一个二次贝塞尔曲线。

抛物线速度控制

抛物线速度前半段由快变慢,后半段由慢变快是由CAKeyframeAnimation 的 timingFunction 进行控制的,timingFunction是CAMediaTimingFunction类型的。CAMediaTimingFunction可以通过functionWithName:(NSString *)name 进行初始化,输入值 name的取值范围包括 linear(数值平均增长)、easeIn(先快后慢)、easeOut(先慢后快)、easeInEaseOut(先快后慢先慢后快)。也可以通过 functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y 进行初始化,输入值为三次贝塞尔曲线的两个控制点坐标,控制点坐标取值范围都是在[0,1]之间。因此通过functionWithName函数是无法满足我们的需求的,那么只能使用函数functionWithControlPoints了。

functionWithControlPoints所使用的三次贝塞尔曲线大概可以使用下图进行表示(图片来源于网络,请忽略图片上面的横纵坐标文字):

横向坐标定义为需要变化的数值 ,纵坐标定义为时间 那么 p1  和 p2 就是这个函数的两个输入的控制点参数

使用CoreAnimation 实现相机拍摄照片之后动画效果的更多相关文章

  1. Android Camera解析(上) 调用系统相机拍摄照片

    开发中我们常须要通过相机获取照片(拍照上传等).一般通过调用系统提供的相机应用就可以满足需求:有一些复杂需求还须要我们自己定义相机相关属性,下篇我们会涉及到. 首先我们来研究怎样简单调用系统相机应用来 ...

  2. Android调用相机拍摄照片并显示到 ImageView控件中

    在前面的一篇文章中曾介绍过简单的开启相机照相功能,详见 Android简单调用相机Camera功能,实现打开照相功能 ,这一次就会将前面拍摄的照片显示到ImageView中,形成一个完整的效果 看实例 ...

  3. Swift - 使用相机拍摄照片

    1,打开相机拍照 通过设置图片控制器UIImagePickerController的来源为UIImagePickerControllerSourceType.Camera,便可以打开相机 1 2 3 ...

  4. 15个来自 CodePen 的酷炫 CSS 动画效果【下篇】

    CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...

  5. 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

    [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...

  6. 与众不同 windows phone (21) - Device(设备)之摄像头(拍摄照片, 录制视频)

    原文:与众不同 windows phone (21) - Device(设备)之摄像头(拍摄照片, 录制视频) [索引页][源码下载] 与众不同 windows phone (21) - Device ...

  7. 【Android Developers Training】 48. 轻松拍摄照片

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 47. 序言:拍摄照片

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

    [源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 win ...

随机推荐

  1. Vue 框架-09-初识组件的应用

    Vue 框架-09-初识组件的应用 今天的第一个小实例,初步使用组件: 在 app.js 中定义模板组件,在 html 文件中使用自定义标签来显示 js 文件中定义的 html 代码块 比如说,下面定 ...

  2. Python 3从入门到精通02-python的简单使用

    Python 3中的打印语句和字符串使用: Python中的常见数学运算: 这样的简单基础知识,你需要花5分钟就可以了,很基础的东西.

  3. 在 Azure 中备份 Linux 虚拟机

    可以通过定期创建备份来保护数据. Azure 备份可创建恢复点,这些恢复点存储在异地冗余的恢复保管库中. 从恢复点还原时,可以还原整个 VM,或只是还原特定的文件. 本文介绍如何将单个文件还原到运行 ...

  4. VisualSVN Server迁移的方法

    VisualSVN Server迁移涉及到两种情况: 第一种情况:VisualSVN Server没有更换电脑或者服务器,只是修改Server name. 第二种情况:当VisualSVN Serve ...

  5. 定制二选一按钮SwitchButton

    定制二选一按钮SwitchButton 效果: 源码: SwitchButton.h 与 SwitchButton.m // // SwitchButton.h // KongJian // // C ...

  6. PowerShell管理SCOM_批量设置维护模式(下)

    #定义存储需要置为维护模式的计算机名称列表$serverlist = "C:\scomm\servers.txt"#定义RMS服务器名称$rmsServerName=”scomw. ...

  7. Linux优化远程SSH连接

    优化远程SSH连接 1.Linxu和Window的ssh连接区别 Windom默认3389端口,管理员administartor 普通是guest Linux 默认22端口 管理员root 普通一堆 ...

  8. 使用Vundle管理Vim插件

    附:仓库地址 附:我自用的vim配置文件,里面注释很多,仅供参考. Vundle是一款Vim的插件管理软件(Linux),用起来很方便的原因有几点: 支持插件超多,可以来源于github.Vundle ...

  9. ZT 9种排序

    9种排序 2012-09-19 14:58 66人阅读 评论(0) 收藏 编辑 删除 algorithmfpfilemergeintegerfloat [cpp] view plaincopy #in ...

  10. 【原创】python内存泄漏以及python flask框架莫名coredump

    1.python内存泄漏 今天在看服务器上的进程时,用top查的时候,发现一个一直跑的脚本程序内存竟然达到了1.6G,这个脚本我有印象,一开始仅占用20M左右,显然是内存泄漏了. 用gc和objgra ...