Android属动画ObjectAnimator和ValueAnimator应用
区别:
ObjectAnimator 是直接对某个view进行更改。
ValueAnimator 根据 TimeInterpolator 在不断产生相应的数据,来传进view ,view自己做改变。
介绍:
- 属性动画是通过改变某个控件的属性值来创造动画,比如在规定的时间内改变某个控件的X坐标,则会产生一个平移的动画效果。
- 坚持使用属性动画和帧动画,而不要使用补间动画,补间动画会造成控件移动到目的地但是控件的热点(产生事件的范围)仍然在原地。
- 属性动画几乎可以产生一切你想要的效果,一般在插入动画时,默认为匀速从起点到终点,可以通过插值改变从起点到终点的效果
- 属性动画分为ObjectAnimator和ValueAnimator,其中ObjectAnimator是继承于ValueAnimator
ObjectAnimator
对控件的某个属性执行一次动画。
1.通过 ObjectAnimator.ofFloat(<控件>,<控件属性>,<从什么float值>,<到什么float值>).setDuration(1000).start();来创建一次动画。
其中ofFloat是根据后面属性值的类型设置的。如果是整型,可以设置为ofInt。
如果有多个这样的,一次执行并不会分先后顺序,是一起执行,包括对同一控件的操作,因为设置动画并不会阻碍主线程。
//旋转动画 rotationX,Y分别代表绕着X,Y轴旋转,rotation表示围绕Z轴旋转ObjectAnimator rotationX = ObjectAnimator.ofFloat(mImage, "rotation", 0.5f, 360f);//缩放动画 scaleX,Y分别代表沿着X,Y轴旋转ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImage, "scaleX", 0, 1);//透明度动画 0 -> 1从完全透明到完全不透明ObjectAnimator alpha = ObjectAnimator.ofFloat(mImage, "alpha", 0, 1);//平移动画 translationX,Y沿着X,Y轴平移ObjectAnimator translationX = ObjectAnimator.ofFloat(mImage, "translationX", 500);
另外,如果控件属性是自定义的,这个属性一定要实现getter和setter。
ObjectAnimator animator1 = ObjectAnimator.ofFloat(progressVew, "progress", 0, 100);public void setProgress(float progress) {this.progress = progress;invalidate();}public float getProgress() {return progress;}
2.为了是属性复用化,节省代码操作,我们把对控件的一组属性的一次操作提取出来称为一个属性操作集,比如,我想对控件进行平移和旋转,我们可以先把平移和旋转(以及他们操作的数值)单独拿出来作为一个属性,然后控件调用这个动画集,就可以实现无论什么控件都可以公用这个属性动画。
操作:
通过 PropertyValuesHolder pro = PropertyValuesHolder.ofFloat("translationX",0F,100F);封装平移X的动画。
然后PropertyValuesHolder pro2 =PropertyValuesHolder.ofFloat("rotation",0F,360F);封装旋转360的动画。
最后通过ObjectAnimator.ofPropertyValuesHolder(<控件>,pro,pro1,pro2);来为某个控件设置以上动画,其他控件也可复用以上代码。
3.以上只是说明了对控件的多个属性一次操作,并没有说明控件属性改变的先后顺序,以及对多个控件一起操作。
这是我们引入了AnimatorSet先实例化这个属性动画集合 AnimatorSet set = new AnimatorSet().
通过set.play(<animator1>).with(<animator2>);来表示让Animator1和Animator2一起执行,
通过set.play(<animator1>).after(<animator2>)来表示让Animator1在Animator2后执行
通过set.play(<animator1>).before(<animator2>)来表示让Animator1在Animator2之前执行、
其中Animator1和Animator2都可以填充ObjectAnimator。这样就可以对某个控件的先后顺序和对多个控件的动画配合起到至关作用。
4.以上所表示的动画都是将某个属性从一个值匀速的改变成另一个值。
我们可以用set.setInterpolator();来设置一个改变的效果。里面只要new 一个Interpolator方可,比如:set.setInterpolator(new AccelerateInterpolator());
//透明度动画值:开始透明度,结束透明度...
//可以设置多个值让他反复变化
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0).setDuration(5000).start();
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0, 1).setDuration(5000).start();
ValueAnimator
1.ValueAnimator并不会改变属性的大小,他只是在一段时间生成某些值,比如上面的ofFloat中设置了从0F,100F,并设置时间为1000。则ValueAnimator的作用就是在1000中匀速生成0F到100F的值,然后再为控件在1000中为控件的属性设上不同值,这就是动画的原理。
我们可以通过线程和线程休眠来设置动画,但是这样太占用资源,所以我们不建议使用线程而使用Animator。
2.我们可以获取1000内产生的值
ValueAnimator value = ValueAnimator.ofFloat(0F,100F);value.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();// 把这个value设置给控件的某一个属性}});
这样就可以获取,我们可以通过设置一个计时器,就是每秒就为控件设置获取到的值。
3.我们可以自定义获取的值(通过泛型),这样就显得更加灵活,可以在一段时间内得到我们想要的值
value.ofObject(new TypeEvaluator<Float>() {@Overridepublic Float evaluate(float fraction, Float startValue, Float endValue) {return null;
// 这里可以自己自定义 返回的数据 , fraction 是0到1之间的数 这里确定的是每一帧的数据}},0F,100F);new TypeEvaluator<Boolean>() {@Overridepublic Boolean evaluate(float fraction, Boolean startValue, Boolean endValue) {return null;}};
此时我们可以反回任意的值,其中fraction是从0到1,相当于进度的百分比 我们可以通过条件语句判断来反回真正需要反回的值,然后通过addUpdateListener 就可以很灵活的实现各种值的返回。
4. 我们还可以控制动画的执行速度 运用插值器
mAnimator.setInterpolator(new Interpolator() {@Overridepublic float getInterpolation(float input) {return 0;
// 这里 input与 return 都是0到1之间的数 , 两者之间我们可以编写 y = f(x) 的函数,斜率变化 就是我们动画的播放速率变化}});
常见插值器:
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速AnticipateInterpolator 开始的时候向后然后向前甩AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值BounceInterpolator 动画结束的时候弹起CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线DecelerateInterpolator 在动画开始的地方快然后慢LinearInterpolator 以常量速率改变OvershootInterpolator 向前甩一定值后再回到原来位置
Android属动画ObjectAnimator和ValueAnimator应用相关推荐
- Android属性动画 ObjectAnimator
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616 本文出自[赵彦军的博客] 文章目录 ObjectAnimator ...
- Android 属性动画ObjectAnimator使用demo,组合动画
//第一个参数:指定执行动画的控件,第二个参数:指定控件的属性,第三个参数是可变长参数 public static ObjectAnimator ofFloat(Object target, Stri ...
- Android 属性动画(Property Animation) ValueAnimator 的介绍
先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...
- android 4 动画,[Android]开发App,你得知道这些4——动画
0.前言 上一篇文章中,我们讲解了Android的触摸事件 有兴趣的可以去看一看 准备工作 在读本文前,你最好有以下准备: (1)安装Android Stuido(以下简称AS) (2)有一定的Jav ...
- Android属性动画(Property Animation)
前言 属性动画系统是一个强大的框架,可以用来为添加几乎各种动画.你可以通过按时间改变对象的属性来定义任何动画,无论这个对象是否被绘制在屏幕内.一个属性动画在特定的时间范围内改变一种属性(也就是一个对象 ...
- (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...
- android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...
大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...
- android动画---ObjectAnimator基本使用
一.使用objectAnimator实现下图的效果(不会做gif图) 点击前: 点击后 方法介绍: public static ObjectAnimator ofFloat(Object target ...
- Android -- Fragment动画异常Unknown animation name: objectAnimator
异常 Caused by: java.lang.RuntimeException: Unknown animation name: objectAnimator 异常代码 FragmentTransa ...
最新文章
- glib 2.0 arm linux,glib源码安装使用方法
- Push Notification (1)Google C2DM 服务
- wxWidgets:wxStringTokenizer类用法
- A - System Administrator CodeForces - 245A(水题)
- centos 6.5 apache mysql php_CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
- 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
- 什么是树(Tree),数据结构中一般有哪些树?
- WPF-005:关于使用PageFunction导航中KeepAlive的使用
- Starling GodRay 效果实现
- Editplus配置VC++(1) 及相关注意事项
- 网站/APP统计分析工具及教程
- ArcMap通过空间校正工具转换BJ-54坐标系到WGS-84坐标系
- ubuntu16.04 将火狐浏览器语言设置成中文
- 零跑汽车冲刺港股:年营收31亿 去年曾募资88亿
- VM虚拟机安装CentOS 7详解
- 深入探访支付宝双11十年路,技术凿穿焦虑与想象极限 1
- 深入浅出计算机组成原理:冒险和预测(一)-hazard是“危”也是“机(第22讲)...
- Mac如何使用Windows各种老式打印机(P1007为例)
- linux系统电视盒子到底是什么
- Android屏幕图片资源大小
热门文章
- java rest 知乎_java 自动化 三分钟带你理解 RESTful
- kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
- rz sz命令_5分钟学linux命令之split
- Micropython教程之TPYBoard开发板DIY智能温控小风扇(萝卜学科编程教育)
- AngularJs 1.5 $location获取url参数
- [译]开始对Angular App进行单元测试(1)
- iis 发布MVC HTTP错误 403.14
- Mongodb 请求处理流程
- Linux 搭建SVN 服务器
- 思科2950配置端口镜像