使用CoreAnimation 实现相机拍摄照片之后动画效果

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

这是点击开始之后代码

-(IBAction)btnStartClick:(id)sender
{
    CABasicAnimation *baseanimation1=[CABasicAnimation animationWithKeyPath:@"transform.scale.x"];
    [email protected](1.0f);
    [email protected](20.0f/myview.frame.size.width);

    CABasicAnimation *baseanimation2=[CABasicAnimation animationWithKeyPath:@"transform.scale.y"];
    [email protected](1.0f);
    [email protected](20.0f/myview.frame.size.height);

    CAAnimationGroup *cg=[CAAnimationGroup animation];
    cg.duration=0.2;
    [email protected][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 就是这个函数的两个输入的控制点参数

时间: 2024-11-04 18:24:39

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

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

在前面的一篇文章中曾介绍过简单的开启相机照相功能,详见?Android简单调用相机Camera功能,实现打开照相功能?,这一次就会将前面拍摄的照片显示到ImageView中,形成一个完整的效果 看实例 MainActivity.java package com.example.camera; import java.io.File; import android.app.Activity; import android.content.Intent; import android.graphic

偶尔,当拍摄从相册或图片相机拍摄照片黑色解决问题的方法,解决问题和头部转动的方法

我尝试了很多方法,在线.无解! 其目的是相同的,它是基于图像的方向orientation 对于旋转相应的角度,达到我们想要的效果.! 的条形码直接观看,我曾是imagePickerController要获取的图片 #pragma mark - UIImagePickerControllerDelegate methods //当选择一张图片后进入这里 -(void)imagePickerController:(UIImagePickerController *)picker didFinishP

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

CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文章为大家挑选了15个超炫的 CSS 动画效果的例子,这些 Demo 可以说都是艺术品.(为保证最佳的效果,请在 Chrome.Firefox 和 Safari 等现代浏览器中浏览) 9. 3D Synth Pure CSS 3D Synthesizer (mousedown for rotation

赞!15个来自 CodePen 的酷炫 CSS 动画效果

CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文章为大家挑选了15个超炫的 CSS 动画效果的例子,这些 Demo 可以说都是艺术品.(为保证最佳的效果,请在 Chrome.Firefox 和 Safari 等现代浏览器中浏览) 1. JavaScript Mickey Watch Apple watch like Mickey watch by

iOS拍摄照片

iOS拍摄照片 demo UI 添加一个UIImageView来显示图片,另外使用一个按键来进入拍照界面. 效果图如下: 实现代码 1.设置代理,UIImagePickerController是UINavigationController的子类,所以UIImagePicker- Con-troller的委托也要遵守UINavigationControllerDelegate协议. @interface ViewController : UIViewController<UINavigationC

Android 照相机拍摄照片,压缩后储存于SD卡

一般相机拍摄的照片大小为3-4M左右,这里因为需要完成将拍摄好的照片上传到服务器功能,所以需要将得到的照片进行压缩.这里演示就直接存放在SD卡中. 网上搜索了不少资料,得知可以使用:inSampleSize 设置图片的缩放比例. 但是,这里需要注意: 1)inJustDecodeBounds = true; 需要先设置为真,表示只获得图片的资料信息.如果此时检验bitmap会发现bitmap==null; 2)如果需要加载图片的时候,必须重新设置inJustDecodeBounds = fals

win8 metro 调用摄像头拍摄照片并将照片保存在相应的位置

刚刚做过这类开发,所以就先献丑了,当然所贴上的源码都是经过验证过的,已经运行成功了,希望可以给大家一些借鉴: 下面是metro UI代码: <Page x:Class="Camera.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

06模块-camera【拍摄照片或视频】

Camera模块管理设备的摄像头,可用于拍照.摄像操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <title>Acceleromet

ios 动画效果

转载:http://www.cnblogs.com/ludashi/p/4160208.html 一.封装动画方法 1.用CATransition实现动画的封装方法如下,每句代码是何意思,请看注释之. 1 #pragma CATransition动画实现 2 - (void) transitionWithType:(NSString *) type WithSubtype:(NSString *) subtype ForView : (UIView *) view 3 { 4 //创建CATra