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

这是点击开始之后代码

-(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. 地图经纬度坐标与屏幕坐标的转换(android版)

    我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...

  2. flutter开发中常用的dart插件

    flutter插件官网地址:https://pub.dartlang.org/packages/ 1. image_picker 一个可以从图库选择图片,并可以用相机拍摄新照片的flutter插件 2 ...

  3. 云卡门禁苹果SDK_BLEDOOR_SDK_IOS_2016_12_15

    // // BLElib.h // BLElib // // Created by szbosk on 16/8/16. // Copyright © 2016年 szbosk. All rights ...

  4. 软工读书笔记 week 7 ——《构建之法》

    总时长近两周的结对项目终于算是结束了,马上要重新开启团队项目.于是这几天决定对<构建之法>一书中与团队项目及需求分析有关的章节进行重点阅读,希望能够从中得到启发,并运用到接下来的团队项目中 ...

  5. zTree创建quickSearch检索框

    <!--html元素----> <div id="plantTreeDiv" class="zTree-box treeZone"> & ...

  6. vuejs code splitting with webpack 3种模式

    我们知道一个web app如果太大会严重影响用户的体验,如何能够最快速度地让用户看到完整页面是优化web应用需要做的重要工作. 这其中使用code split实现lazy加载,只让用户初次访问时只加载 ...

  7. [域|Domain] The trust relationship between this workstation and the primary domain failed 此工作站和主域间的信任关系失败

    PS> $cred = Get-Credential domain.sample.com;Reset-ComputerMachinePassword -Credential $cred -Ser ...

  8. RAC性能分析 - gc buffer busy acquire 等待事件

    概述---------------------gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer  busy分为gc buffer busy acquire和gc ...

  9. [翻译] NSDate-TimeAgo

    NSDate-TimeAgo https://github.com/kevinlawler/NSDate-TimeAgo NSDate+TimeAgo has merged with DateTool ...

  10. Linux ss命令详解

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息 ...