Android 属性动画(一)
2016-06-23 15:26
357 查看
网上关于属性动画的博客也算是很多了,看过之后,然后自己去用的过程中还是感觉不是很详细,因为有些东西还是需要自己实践过之后才会发现。(要api11之后才可以使用,由于市场上手机基本是4.0以上的系统了,所以以后写动画可以直接用属性动画)
关于动画应该分为补间动画、帧动画、属性动画;
补间动画中存在着平移动画、缩放动画、旋转动画、渐变动画。属性动画中也包含这些,然而为何google为何又要弄出属性动画来,原因还是比较多的,先举个最简单的例子:
补间动画中平移动画,一个按钮移动后,使用setFillAfter停留在最后位置,如果你按钮设置点击事件,你会发现点击停留后位置的按钮是无法触发点击事件的,但是点击按钮原来位置可以触发点击事件。而属性动画是可以在最后停留位置触发点击事件的。这里就不贴代码了,自己可以去试试。
对于属性动画对于类似补间动画的类似效果我们可以使用ObjectAnimator和ValueAnimator来实现。
打开ObjectAnimator源码可以发现,它其实是ValueAnimator的子类,对其进一步的封装。
本篇主要讲解ObjectAnimator。ValueAnimator的讲解后续再给补上
![](https://img-blog.csdn.net/20160623145042977)
(1)平移
属性名包含translationX、translationY、X、Y(ps:我试了一下属性名translation,log中会错误,即translation属性名是不存在的)
首先说下都是平移为什么会有translationX和X两种属性名,它们的区别在于前者为相对位置,后者为绝对位置
将图片放在布局的中央
对比一下两种属性可以发现其中的差别
translationX为相对位置的X=0坐标开始移动300
X则为绝对位置(即窗口的X=0坐标)开始移动300
translationY和Y的差别原理相同
我们查看下ObjectAnimator.ofFloat的源码
![](https://img-blog.csdn.net/20160624150931667)
查看到源码我们可以看到,最后传的值是float… ,可以传递多个float类型的值,其中主要是传一个值及多个值中存在着区别
我分别写了如下代码进行对比:
![](https://img-blog.csdn.net/20160624152535424)
![](https://img-blog.csdn.net/20160624152551427)
mAnimator = ObjectAnimator.ofFloat(iv,”translationY”,300f);这段代码,执行完之后,再次执行将会发现图片不会再动,其实动画仍然是执行了,只是起value值一直为300,(第一次则是从0开始到300),对比一下两次的Log便可以发现
第一次执行开始以及结束:
![](https://img-blog.csdn.net/20160624153708221)
![](https://img-blog.csdn.net/20160624153720425)
第二次执行开始以及结束:
![](https://img-blog.csdn.net/20160624154441029)
![](https://img-blog.csdn.net/20160624154501076)
这三个其实就都是从相对位置0坐标开始,到达最后的位置,中间的值便是从上一个坐标到达该坐标,最终到达终点坐标位置。每次位移距离则是后者减去前者的值。
(2)旋转
属性名包含rotation、rotationX、rotationY
除属性名外其他与平移用法相同
rotation:默认为以view的中心点旋转(可以设置为某个点),为2d旋转
rotationX:以view的X中心轴进行旋转,3d旋转
rotationY:以view的Y中心轴进行旋转,3d旋转
(3)缩放
属性名包含scaleX、scaleY(本以为存在scale属性同时缩放X方向和Y方向,试过之后发现是不存在的)
除属性名外其他与平移用法相同
(4)淡入淡出
属性名alpha
(5)动画监听器
细心的朋友应该在讲平移动画的时候看到了这么几行代码:
这些listener还是很重要的,我们可以在这些状态中进行一些复杂的操作。addUpdateListener是监听动画执行中值的变化;addListener则是监听动画的开始、取消、结束、重复;addPauseListener则是监听动画的暂停、恢复
其实动画是有几种状态的分别为
动画执行动作可分为:
详细可以查看这篇文章
(补充)
Animator还存在着延时开始
Animator.setStartDelay(1000);
重复次数
setRepeatCount(2);
重复的模式
Animator.setRepeatMode(ValueAnimator.REVERSE);
差值器
Animator.setInterpolator(new LinearInterpolator());
以及使用xml来创建动画
后面会详细讲解。
这篇就写到这里吧。
关于动画应该分为补间动画、帧动画、属性动画;
补间动画中存在着平移动画、缩放动画、旋转动画、渐变动画。属性动画中也包含这些,然而为何google为何又要弄出属性动画来,原因还是比较多的,先举个最简单的例子:
补间动画中平移动画,一个按钮移动后,使用setFillAfter停留在最后位置,如果你按钮设置点击事件,你会发现点击停留后位置的按钮是无法触发点击事件的,但是点击按钮原来位置可以触发点击事件。而属性动画是可以在最后停留位置触发点击事件的。这里就不贴代码了,自己可以去试试。
对于属性动画对于类似补间动画的类似效果我们可以使用ObjectAnimator和ValueAnimator来实现。
打开ObjectAnimator源码可以发现,它其实是ValueAnimator的子类,对其进一步的封装。
本篇主要讲解ObjectAnimator。ValueAnimator的讲解后续再给补上
(1)平移
属性名包含translationX、translationY、X、Y(ps:我试了一下属性名translation,log中会错误,即translation属性名是不存在的)
首先说下都是平移为什么会有translationX和X两种属性名,它们的区别在于前者为相对位置,后者为绝对位置
将图片放在布局的中央
对比一下两种属性可以发现其中的差别
ObjectAnimator.ofFloat(iv,"translationX",0.0f,300.0f).setDuration(1000).start(); ObjectAnimator.ofFloat(iv,"X",0.0f,300.0f).setDuration(1000).start();
translationX为相对位置的X=0坐标开始移动300
X则为绝对位置(即窗口的X=0坐标)开始移动300
translationY和Y的差别原理相同
我们查看下ObjectAnimator.ofFloat的源码
查看到源码我们可以看到,最后传的值是float… ,可以传递多个float类型的值,其中主要是传一个值及多个值中存在着区别
我分别写了如下代码进行对比:
mAnimator = ObjectAnimator.ofFloat(iv,”translationY”,300f);这段代码,执行完之后,再次执行将会发现图片不会再动,其实动画仍然是执行了,只是起value值一直为300,(第一次则是从0开始到300),对比一下两次的Log便可以发现
第一次执行开始以及结束:
第二次执行开始以及结束:
mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f); mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f,100f); mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f,100f,200f);
这三个其实就都是从相对位置0坐标开始,到达最后的位置,中间的值便是从上一个坐标到达该坐标,最终到达终点坐标位置。每次位移距离则是后者减去前者的值。
(2)旋转
属性名包含rotation、rotationX、rotationY
除属性名外其他与平移用法相同
rotation:默认为以view的中心点旋转(可以设置为某个点),为2d旋转
rotationX:以view的X中心轴进行旋转,3d旋转
rotationY:以view的Y中心轴进行旋转,3d旋转
//以特定的位置设置为旋转中心点 mAnimator = ObjectAnimator.ofFloat(iv,"rotation",0.0f,-360.0f,0f); iv.setPivotX(300);//设置指定旋转中心点X坐标 iv.setPivotY(300);//设置指定旋转中心点Y坐标 mAnimator.setDuration(1000).start(); //3d旋转 360度(以X轴中心) ObjectAnimator.ofFloat(iv,"rotationX",0.0f,360.0f).setDuration(1000).start(); //3d旋转 360度(以Y轴中心) ObjectAnimator.ofFloat(iv,"rotationY",0.0f,360.0f).setDuration(1000).start();
(3)缩放
属性名包含scaleX、scaleY(本以为存在scale属性同时缩放X方向和Y方向,试过之后发现是不存在的)
除属性名外其他与平移用法相同
//X方向缩放 ObjectAnimator.ofFloat(iv,"scaleX",1.0f,2.0f).setDuration(1000).start(); //Y方向缩放 ObjectAnimator.ofFloat(iv,"scaleY",0.0f,2.0f).setDuration(1000).start();
(4)淡入淡出
属性名alpha
ObjectAnimator.ofFloat(iv,"alpha",0f,1f).setDuration(1000).start();
(5)动画监听器
细心的朋友应该在讲平移动画的时候看到了这么几行代码:
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); Log.i(TAG,""+value); } }); mAnimator.addListener(new MyAnimatorListenerAdapter()); mAnimator.addPauseListener(new MyAnimatorListenerAdapter());
这些listener还是很重要的,我们可以在这些状态中进行一些复杂的操作。addUpdateListener是监听动画执行中值的变化;addListener则是监听动画的开始、取消、结束、重复;addPauseListener则是监听动画的暂停、恢复
其实动画是有几种状态的分别为
boolean isStarted() // 开始状态(需api14及以上才可使用) boolean isRunning() // 执行中状态 boolean isPaused() // 暂停状态需(api19及以上才可使用)
动画执行动作可分为:
Animator.start() // 开始动画 Animator.end() // 结束动画 Animator.cancel() // 取消动画 Animator.pause() // 暂停动画(需api19及以上才可使用) Animator.resume() // 暂停后恢复动画(需api19及以上才可使用)
详细可以查看这篇文章
(补充)
Animator还存在着延时开始
Animator.setStartDelay(1000);
重复次数
setRepeatCount(2);
重复的模式
Animator.setRepeatMode(ValueAnimator.REVERSE);
差值器
Animator.setInterpolator(new LinearInterpolator());
以及使用xml来创建动画
后面会详细讲解。
这篇就写到这里吧。
相关文章推荐
- ItemTouchHelper源码解析
- android --APK下载、安装、启动
- Android常用框架混淆代码
- Android——软键盘操作+fragment之间传递参数+TextView限制字数,显示"..."
- Android SDK下载和更新
- 自定义Switch 控件textOn和textOff字体大小
- Android内容提供者(二)创建自己的Provider
- 解决启动Android应用程序时出现白屏或者黑屏的问题
- android 获取手机联系人信息
- Android studio 开发者信息设置
- android TextView 垂直自动滚动
- Android中正确保存view的状态
- android studio 快捷键修改
- Android单位
- Android工具类系列-BitmapUtil
- 学习心得(Android之WakeLock机制分析)
- 公共技术点之 Android 动画基础
- android 框架汇总
- Android DownloadManager 下载完成并安装
- PinnedHeaderExpandableListView的使用