动画特效一:图片翻转
2015-07-15 09:43
351 查看
前几节内容中,我详细的讲解了动画的理论知识及基本使用,在以后的章节中,我将用实际的案例来展示动画特效。这一节的例子是图片翻转。先看看最终效果:
![](http://img.blog.csdn.net/20150715094719034?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
素材准备:提供了两张图片,Baby.png和Xiaoming.png,并且它们的尺寸大小均为150 X 150。图片如下:
![](http://img.blog.csdn.net/20150715095243793?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150715095259650?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
设计思路一:
1. 放置一个ContainerView,其尺寸大小也为150 X 150,用于存放图片。
2. 将上面的两张图片均放置在ContainerView中。
3. 进行outlets连线工作。
XIB中设计界面如下图:
![](http://img.blog.csdn.net/20150715095605857?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
编程思路:
1. 设计一个变量front,用于判断当前显示的是哪一张图片。
2. 初始化的时候,将后面的图片绕着y轴旋转180度,达到镜像的效果,这样的话,等旋转到前面的时候,就是正面显示了。
3. 执行UIView的block动画操作,完成翻转效果。
代码:
1. front变量:
2. 初始化工作:
首先设置图片的显示效果为圆形,即cornerRadius的大小为图片宽度的一半; 初始化front的值,表示默认显示前面的图片;关键的一句
我们可以使用view debugger来分析层次结构。
先看正面图:
![](http://img.blog.csdn.net/20150715101357773?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看出有五层: (UIWindow, UIView, UIContainerView, backImageView, frontImageView).
然后再看看背面图:
![](http://img.blog.csdn.net/20150715101623791?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Baby.png这张图片和我文章开头列出的头像方向是一致的,而我们此时是从背面看过去的,说明CATransform3DMakeRotation的确将图片进行了翻转了180度的工作。
3. 动画最终实现的代码:
大致的思路就是先将图片旋转90度,达到这个点的时候,立刻将当前图片隐藏,将背面图片显示,并且将front变量的值进行取反工作。然后紧接着在进行旋转90度的操作工作。
设计思路二:
直接使用系统自带的transitionWithView实现动画效果。
XIB中设计界面如下图:
![](http://img.blog.csdn.net/20150715102430260?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意到,此时ContainerView中只存放一张图片,而图片的切换工作,都交给了系统自带的功能来完成了。
此时,动画的实现代码如下:
素材准备:提供了两张图片,Baby.png和Xiaoming.png,并且它们的尺寸大小均为150 X 150。图片如下:
设计思路一:
1. 放置一个ContainerView,其尺寸大小也为150 X 150,用于存放图片。
2. 将上面的两张图片均放置在ContainerView中。
3. 进行outlets连线工作。
XIB中设计界面如下图:
编程思路:
1. 设计一个变量front,用于判断当前显示的是哪一张图片。
2. 初始化的时候,将后面的图片绕着y轴旋转180度,达到镜像的效果,这样的话,等旋转到前面的时候,就是正面显示了。
3. 执行UIView的block动画操作,完成翻转效果。
代码:
1. front变量:
@property (nonatomic,assign,getter = isFront) BOOL front;
2. 初始化工作:
- (void)viewDidLoad { [super viewDidLoad]; self.backImageView.layer.cornerRadius = 75; self.backImageView.layer.masksToBounds = YES; self.frontImageView.layer.cornerRadius = 75; self.frontImageView.layer.masksToBounds = YES; self.backImageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0); self.front = YES; }
首先设置图片的显示效果为圆形,即cornerRadius的大小为图片宽度的一半; 初始化front的值,表示默认显示前面的图片;关键的一句
self.backImageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
我们可以使用view debugger来分析层次结构。
先看正面图:
可以看出有五层: (UIWindow, UIView, UIContainerView, backImageView, frontImageView).
然后再看看背面图:
Baby.png这张图片和我文章开头列出的头像方向是一致的,而我们此时是从背面看过去的,说明CATransform3DMakeRotation的确将图片进行了翻转了180度的工作。
3. 动画最终实现的代码:
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.rotateView.layer.transform = CATransform3DRotate(self.rotateView.layer.transform, M_PI_2, 0, 1, 0); } completion:^(BOOL finished) { if(self.isFront){ self.frontImageView.hidden = YES; self.backImageView.hidden = NO; self.front = NO; } else{ self.frontImageView.hidden = NO; self.backImageView.hidden = YES; self.front = YES; } [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.rotateView.layer.transform = CATransform3DRotate(self.rotateView.layer.transform, M_PI_2, 0, 1, 0); } completion:nil]; }];
大致的思路就是先将图片旋转90度,达到这个点的时候,立刻将当前图片隐藏,将背面图片显示,并且将front变量的值进行取反工作。然后紧接着在进行旋转90度的操作工作。
设计思路二:
直接使用系统自带的transitionWithView实现动画效果。
XIB中设计界面如下图:
注意到,此时ContainerView中只存放一张图片,而图片的切换工作,都交给了系统自带的功能来完成了。
此时,动画的实现代码如下:
[UIView transitionWithView:self.containerView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ self.iconView.image = [UIImage imageNamed:@"Baby"]; } completion:^(BOOL finished) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [UIView transitionWithView:self.containerView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{ self.iconView.image = [UIImage imageNamed:@"Xiaoming"]; } completion:nil]; }); }];
相关文章推荐
- JSBinding + SharpKit / 常见问题
- 第一次到这个网站
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- [架构]--系统架构演化之路
- ubuntu 操作命令
- Eclipse下导入外部jar包的3种方式
- 实战EmptyView,为ListView的加载缓冲
- 备份电脑系统的操作
- Eclipse项目名出现红叉
- centos7.1下载
- [刷题]Singleton
- 写给初学者的6条网页设计安全配色指南
- java 编写和调用webservice文章
- 小游戏-别走白格
- PHP 判断是否包含某字符串
- 一些技术要点
- a glimpse of intel atom c3000 family : 新特性
- laravel5.0 服务器上被坑的 bootstrap
- cf558B查找最短的最大区间段,利用二维数组巧妙简化运算
- Java线程面试题Top50