iOS easing tween 动画效果

在iOS 开发中,要做一个动画效果,我们会用到CAKeyframeAnimation。 这个库提供了一些对frame 动画的控制,什麽是frame 动画? frame 动画就好比电视动画那样,由一格一格的图画(也可以想像成frame)构成, 快速播放图画便成了动画。 在CAKeyframeAnimation 的概念是一样, 你只需要提供keyframe 的信息, 程序会自动完成keyframe之间的”图画”。 如果大家有用过adobe flash 这工具, 其实是等同motion/shape tween。 好吧!举个例子比较清楚明白。 如果想对一个图形做一个弹出的动画, 用CAKeyframeAnimation可以写成

1">234567891011121314151617181920CAKeyframeAnimation *boundsOvershootAnimation = [CAKeyframeAnimation animationWithKeyPath:@"bounds.size"];CGSize startingSize = CGSizeZero;CGSize targetSize = CGSizeMake(100,100);CGSize overshootSize = CGSizeMake(120,120);CGSize undershootSize = CGSizeMake(80,80);NSArray *boundsValues = [NSArray
arrayWithObjects:[NSValue valueWithCGSize:startingSize], [NSValue valueWithCGSize:targetSize], [NSValue valueWithCGSize:overshootSize], [NSValue valueWithCGSize:undershootSize], [NSValue valueWithCGSize:targetSize], nil];[boundsOvershootAnimation setValues:boundsValues];NSArray *times = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:
0.5f], [NSNumber numberWithFloat:0.8f], [NSNumber numberWithFloat:0.9f], [NSNumber numberWithFloat:1.0f], nil]; [boundsOvershootAnimation setKeyTimes:times];boundsOvershootAnimation.duration = 1.0;

这个弹出的动画包含了5个keyframe, 目的是令弹出带点跳动的感觉。 [boundsOvershootAnimation setValues:boundsValues] 这一行代码就设定了这动画的keyframe。 另一个重要的元素就是时间, CAKeyframeAnimation 提供了keyframe 时间的控制, 如果不设定便会以直线性发展。 而这动画会以先慢後快的形式出现, 为什麽呢? 请看[boundsOvershootAnimation setKeyTimes:times] 这一段。 动画长一秒, 由0-0.5秒会进行 startingSize 到 targetSize 的动画, 0.5-0.8秒会进行 targetSize 到 overshootSize 的动画。 如此类推就会做出先慢後快的效果。

CAKeyframeAnimation 还提供了其他方法去控制keyframe, 以下是一个透明淡出的动画。

123456CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0f]; opacityAnimation.toValue = [NSNumber numberWithFloat:0.0f];opacityAnimation.timingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseIn]]; // EaseIn curve//opacityAnimation.timingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; // EaseOut curve//opacityAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:1.0 :0.0 :1.0 :0.1]; // Bezier curve

opacityAnimation.timingFunction 是用来控制动画线性发展。 其中[CAMediaTimingFunction functionWithControlPoints:1.0 :0.0 :1.0 :0.1] 是一个贝塞尔曲线的控制方法。 这也可以令动画做到先慢後快或先快後慢的结果。 你会问, 我怎知道效果会怎样? 这里有一个图表化的工具说明数字线性关係 http://netcetera.org/camtf-playground.html

CAKeyframeAnimation提供了不错的功能, 但对於一些比较複杂的动画效果, CAKeyframeAnimation的配置就会变得複杂, 代码亦会很长。 比方说,我要做一个好像皮球跳动的效果。 我们要计算每一个keyframe的位置, 再为每一个keyframe配置动画时间。要做成这麽的一个效果, keyframe会有很多。所以参考了actionscript的Tween动画之後, 开发了一个用於iOS的Tween效果库。 基本原理是用一些Tween function 包裹计算变化值的公式, 再扩展CAKeyframeAnimation自动按照Tween function来计算keyframe。以下是皮球跳动的效果。

123EasingFunction easingFn = [Easing getBounce];CAKeyframeAnimation *transAnimi = [CAKeyframeAnimation animationWithKeyPath:@"position.x" easeFunction:easingFn.easeOut fromValue:0.0 toValue:200];transAnimi.duration = 3.0;

[Easing getBounce] 是Tween动画库内跳动效果的公式。 [CAKeyframeAnimation animationWithKeyPath:@"position.x" easeFunction:easingFn.easeOut fromValue:0.0 toValue:200]是CAKeyframeAnimation的扩展。 回传的是一般CAKeyframeAnimation, 可以直接用在UIView 物件上。Tween动画库提供以下效果, 图表化可到这里http://hosted.zeh.com.br/tweener/docs/en-us/misc/transitions.html

-Elastic
-Bounce
-Back
-Linear
-Expo
-Quad
-Cubic
-Quart
-Quint
-Sine
-Circ

Tween动画库是可以再扩展。参考下列直线性的公式, t是当前时间值, b是属性开始值, c是属性变化差, d是总时间值, 回传的是t时间的属性值。大家可以自由改变去创建一个新的公式。

12345678910111213+(EasingFunction)getLinear{ EasingFunction ease; ease.easeIn = ^double(double t, double b, double c, double d) { return c*t/d + b; }; ease.easeOut = ^double(double t, double b, double c, double d) { return c*t/d + b; }; ease.easeInOut = ^double(double t, double b, double c, double d) { return c*t/d + b; }; return ease;}

演示Demo

最后附上源码, 请留言交流指教。

http://url.cn/EyBoWa

感谢你的阅读,本文由 腾讯ISUX 版权所有,转载时请注明出处,违者必究,谢谢你的合作。
注明出处格式:腾讯ISUX (http://isux.tencent.com/ios-easing-tween-animation.html)

时间: 2025-01-21 00:21:35

iOS easing tween 动画效果的相关文章

IOS等待时动画效果的实现_IOS

查询时间或长或短,为了提升用户体验,目前用的比较多的手段之一就是查询等待时添加一个动态等待效果.当我们在请求网络时加载页面时有个动作效果,效果图如下: 源代码可以网上找开源项目Coding.net,上面的效果原理为两张图片组合,外面那个则为动画转动,里面的图标则是透明度的变化:主要代码如下: 1:把它封装在EaseLoadingView里面 @interface EaseLoadingView : UIView @property (strong, nonatomic) UIImageView

IOS实现视频动画效果的启动图_IOS

先上效果图 实现思路 主要思路就是用一个控制器来作为播放视频的载体,然后在让这个控制器作为根视图,视频播放完成之后那就该干嘛干嘛了. 话不多说了,下面就放代码好了 先新建一个控制器AnimationViewController在控制器中新建一个属性moviePlayer,记得要先引入系统库<MediaPlayer/MediaPlayer.h> @property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 设置movieP

iOS的GIF动画效果实现

GIF在iOS中的使用场景 GIF在iOS中的使用场景有以下三个方面. (1)GIF图片分解为单帧图片. (2)一系列单帧图片合成GIF图片. (3)iOS系统上展示GIF动画效果. 在GIF的合成和分解方面将会接触到iOS图像处理核心框架ImageIO,作为iOS系统中图像处理的核心框架,它为我们提供了各种丰富的API,本文将要实现的GIF分解与合成功能,通过ImageIO就可以很方便地实现.GIF动画展示效果将结合UIImageView和定时器,利用逐帧展示的方式为大家呈现GIF动画效果.

Android基础知识之tween动画效果_Android

Android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可以使用编码来实现. 下面我们逐一查看tween能够实现的动画效果. 先看看工程的整体结构吧: 我们要实现的效果图如图 点击按钮则执行相应的动画操作. 布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.androi

基于JS实现Android,iOS一个手势动画效果_javascript技巧

废话不多说了,先给大家展示下效果图: 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手势控制图片上下动画滑动实现开合效果,还支持声音效果. 下面是主要的代码 //index.ui.js var do_Animator1 = mm("do_Animator"); do_Animator1.append(500, { y: -1334, curve:

苹果开发之iOS加入购物车动画效果

 代码如下 复制代码 #pragma mark -购物篮按钮点击事件 -(void)shoppingCartButtonAction:(UIButton*)sender {     if ([[userDef objectForKey:@"id"]isEqualToString:@"0"]) {         [self showHUDTextOnly:@"请登录后,再进行操作" ];         return;     }     NSD

IOS 实现3D 浮动效果动画_IOS

涉及到的技术点 CATransform3DRotate 转换坐标系 整体视图的层级结构 tvOSCardView cardImageView cardParallaxView 转换坐标系的代码 CGFloat xFactor = MIN(1, MAX(-1, (touchPoint.x - (self.bounds.size.width / 2)) / (self.bounds.size.width / 2))); CGFloat yFactor = MIN(1, MAX(-1, (touchP

c语言-c,c++实现简单的动画效果

问题描述 c,c++实现简单的动画效果 一个六数码的问题,六个数经过一定的变化变成有序的数 例如 2 5 3 1 4 6 变成了 1 2 3 4 5 6 控制台程序已经写好了,黑白框中能运行处正确结果 目前想做一个简单的动画效果演示一下,需要学习哪些知识,不要太复杂的 = = 网上找的说的太空泛,完全没有方向233 解决方案 ios开发之简单实现loading动画效果js动画效果简单实现iOS简单的动画效果实现 解决方案二: 动画效果演示一下,你要演示什么 解决方案三: 你想要什么样的动画? 最

AngularJS中实现显示或隐藏动画效果的方式总结_AngularJS

AngularJS 是一组用于创建单页Web应用的丰富框架,给构建丰富交互地应用带来了所有需要的功能.其中一项主要的特性就是Angular带来了对动画的支持. 本篇体验在AngularJS中实现在"显示/隐藏"这2种状态切换间添加动画效果. 通过CSS方式实现显示/隐藏动画效果 思路: →npm install angular-animage →依赖:var app = angular.module("app",["ngAnimate"]); →