文章导航
概述
Property Animation故名思议就是通过动画的方式改变对象的属性了,所以他也是功能最为强大的,可以这样说前面的帧动画和视图动画能做到的,他都能做到,并且更为强大
相关的属性
- Duration动画的持续时间,默认300ms。
- Time interpolation:时间差值,乍一看不知道是什么,但是我说 LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的了,定义动画的变化率。
- Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
- Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
- Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。
相关的类
- ObjectAnimator 动画的执行类,后面详细介绍
- ValueAnimator 动画的执行类,后面详细介绍
- AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
- AnimatorInflater 用户加载属性动画的xml文件
- TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
- TimeInterpolator 时间插值,上面已经介绍。
总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。
ObjectAnimator实现动画
之所以选择ObjectAnimator为第一个是因为,这个实现最简单一行代码,秒秒钟实现动画,下面看个例子:
我们想实现ListView的item的折叠和展开
1 |
|
如上所示 我们外层LinearLayout
的高度为60dp
,里面也有两个都是60dp
,这样我们动态改变外层的高度来实现展开和折叠的动画
先说个简单的翻转动画
1 | file_list_item = (LinearLayout)convertView.findViewById(R.id.file_list_item); |
这里rotationX
是怎么来的,原来file_list_item
有setRotationX(float rotationX)
和getRotationX(float rotationX)
方法,所以可以这样做,但是我们想设置高度,但并没有setHeight()
和getHeight()
方法,怎们办呢,我们可以定义一个内部类
1 | private static class ViewWrapper { |
然后就可以这样使用了
1 | file_item_fold_layout.setOnClickListener(new View.OnClickListener() { |
注意的是ofInt()
方法 如果改的值为Int的话一定要用ofInt()
,用ofFloat()
是不会生效的
如果你操作对象的该属性方法里面,比如上例的setRotationX如果内部没有调用view的重绘,则你需要自己按照下面方式手动调用
1 | anim.addUpdateListener(new AnimatorUpdateListener(){ |
多动画同时执行
方式
1 | public void rotateyAnimRun(final View view) |
方式2
1 | public void propertyValuesHolder(View view){ |
ValueAnimator实现动画
ValueAnimator
是ObjectAnimator
的父类它没有ObjectAnimator
强大,但是会相对自由,他只会改变值,而我们可以设置View的属性值来实现动画
1 | public void rotateyAnimRun(final View view) |
AnimatorSet的使用
AnimatorSet就是动画组 可以设置动画同时执行或先后执行
1 | public void togetherRun(View view){ |