动画特效六:三维过度
2015-07-20 09:13
369 查看
这一节讲述一下一个非常好玩的过度效果,文字翻转。先看看静态图:
从图中可以看出,文字“ZY 2014” 被文字“AE 1107”慢慢的压下来,并且有cube(3D)效果。
然后,我们再看看最终Demo的效果。
动画效果分析:
1. 背景图片的淡入淡出效果。
2. 文字的Cube翻转效果。
淡入淡出效果其实很简单,就是切换背景图片的透明度(注意到我背景图的设置,"bg-sunny"在"bg-snowy"的下面,并且它们都占满屏幕)。
背景淡入淡出实现代码:
下面,我们就来详细的分析Cube翻转效果。
实现思路分析:
1. 有新文字从顶部压下来或者从下面顶上去。这个新文字其实是临时创建的UILabel(我把它命名为auxLabel)。它的基本属性和上面正在显示的UILabel一致,只是text不同。
2. auxLabel默认应该显示在UILabel的正上面或者正下面,并且被压缩的很窄。怎样达到这样的效果呢?
首先,我们可以压缩auxLabel,如下图效果:
然后,我们再将auxLabel平移到上面或者下面。
接着开始做动画,将auxLabel慢慢往下压,同时UILabel也慢慢往下变小。当动画完成的时候,此时屏幕上面显示的其实就是auxLabel,而UILabel看不见了。此时,立刻将auxLabel文本的内容赋值给UILabel的text,同时将auxLabel移除掉,这样就完成了“偷梁换柱”的功能了。
也许表达的不够好,直接上代码:
然后直接调用就可以了(AnimationDirection是我定义的一个枚举,用来判断往下压还是网上顶的)。
从图中可以看出,文字“ZY 2014” 被文字“AE 1107”慢慢的压下来,并且有cube(3D)效果。
然后,我们再看看最终Demo的效果。
动画效果分析:
1. 背景图片的淡入淡出效果。
2. 文字的Cube翻转效果。
淡入淡出效果其实很简单,就是切换背景图片的透明度(注意到我背景图的设置,"bg-sunny"在"bg-snowy"的下面,并且它们都占满屏幕)。
背景淡入淡出实现代码:
[UIView animateWithDuration:5 animations:^{ self.bgSnowyView.alpha = 0.0; self.bgSunnyView.alpha = 1.0; }];
下面,我们就来详细的分析Cube翻转效果。
实现思路分析:
1. 有新文字从顶部压下来或者从下面顶上去。这个新文字其实是临时创建的UILabel(我把它命名为auxLabel)。它的基本属性和上面正在显示的UILabel一致,只是text不同。
2. auxLabel默认应该显示在UILabel的正上面或者正下面,并且被压缩的很窄。怎样达到这样的效果呢?
首先,我们可以压缩auxLabel,如下图效果:
然后,我们再将auxLabel平移到上面或者下面。
接着开始做动画,将auxLabel慢慢往下压,同时UILabel也慢慢往下变小。当动画完成的时候,此时屏幕上面显示的其实就是auxLabel,而UILabel看不见了。此时,立刻将auxLabel文本的内容赋值给UILabel的text,同时将auxLabel移除掉,这样就完成了“偷梁换柱”的功能了。
也许表达的不够好,直接上代码:
- (void)cubeTransitionLabel:(UILabel *)label text:(NSString *)text direction:(AnimationDirection)direction { // 1. 备用label和展示的label具有同样的基本属性,只是text不一样 UILabel *auxLabel = [[UILabel alloc] initWithFrame:label.frame]; auxLabel.text = text; auxLabel.font = label.font; auxLabel.textAlignment = label.textAlignment; auxLabel.textColor = label.textColor; auxLabel.backgroundColor = label.backgroundColor; NSInteger flag = direction == AnimationDirectionPositive ? 1 : -1; // 2. 为什么将auxLabel的偏移量设置为label高度的一半? 因为下面又进行了MakeScale操作,而MakeScale操作是以label的中心线为基准的,所以执行之后,auxLabelOffset的位置看上去就是在label的正上方。 CGFloat auxLabelOffset = flag * label.frame.size.height * 0.5; auxLabel.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(0.0, auxLabelOffset)); // 3. 添加auxLabel [label.superview addSubview:auxLabel]; [UIView animateWithDuration:3.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ // 4. 动画执行过程中,auxLabel整体慢慢显示出来 auxLabel.transform = CGAffineTransformIdentity; // 5. 动画执行过程中,label被慢慢“压倒”底部或者顶部 label.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(0.0, -auxLabelOffset)); } completion:^(BOOL finished) { // 6. 动画执行完毕,label的值被赋值为auxLabel的值;label还原回来,并且将临时的auxLabel移除掉 label.text = auxLabel.text; label.transform = CGAffineTransformIdentity; [auxLabel removeFromSuperview]; }]; }
然后直接调用就可以了(AnimationDirection是我定义的一个枚举,用来判断往下压还是网上顶的)。
// 文字Cube效果 [self cubeTransitionLabel:self.flightLabel text:@"AE 1107" direction:AnimationDirectionPositive]; [self cubeTransitionLabel:self.gateLabel text:@"045" direction:AnimationDirectionNegative];
相关文章推荐
- LeeCode-Contains Duplicate
- Android 代码混淆打包
- iOS开发zhiATM机的设计与实现
- Python绘图基础
- 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
- 计蒜客-----泥塑课
- LeeCode-Linked List Cycle
- java synchronized用法
- 初识命令行参数(以my_chmod为例)
- eclipse解决editor does not contain a main type的方法
- Vim技巧之重复
- Android自己动手打造XML解析框架
- 一张图,一棵大树,六种人, 六载人生 ~
- LeeCode-Number of 1 Bits
- uva 11234 Expressions(建立二叉树+层次遍历)
- 本地搭建Hadoop伪分布式环境之三:FlashFXP上传文件到Ubuntu
- eclipse常用的快捷键
- java中的构造方法的使用及作用分析
- 《深入浅出struts2》--第一章,Model2应用程序
- linux安装IPython四种方法