工作一年了 ,用的动画也不少,但是没有总结过关于动画的知识,今天可以总结一下,
首先 动画分为三种
今天我主要总结一下补间动画和属性动画的用法。
动画效果有:AlphaAnimation(透明), ScaleAnimation(伸缩) ,RotateAnimation(旋转), TransLateAnimation(平移); 有时候我们希望一种动画:既有透明,又有伸缩等效果,我们可以通过AnimationSet(集合) 动画集合的方式来实现。这五种效果不仅补间动画有,属性动画也有。
首先看下补间动画效果共有的属性值:
duration 动画持续时间,单位:ms
fillAfter 动画结束时是否保持最后状态
fillBefor 动画金额术后是否恢复到原始状态
fillEnabled 同上
interpolator 设置插值器(设定动画效果,譬如回弹等)
repeatCount 重复的次数
repeatMode 重复的类型(1:reverse 从尾部重复;2:restart 重头重复)
startOffSet 调用start开启动画之后,等待的运行时间,相当于动画sleep时间之后,在自动开启start;
接下来说一下每种动画效果的私有属性:
AlphaAnimation私有属性:
fromAlpha 动画开始透明度(0.0到1.0; 1.0是不透明,0.0是全透明)
toAlpha 动画结束的透明度
RotateAnimation 私有属性:
fromDegrees 旋转开始角度(正代表顺时针度数,负代表逆时针读数)
toDegrees 旋转结束角度
ScaleAnimation 私有属性
fromXScale 初始X轴伸缩比例 (1.0表示无变化)
toXScale 结束X轴伸缩比例
fromYScale 初始Y轴伸缩比例 1.0表示无变化
toYScale 结束Y轴伸缩比例
TranslateAnimation 私有属性
fromXDelta 起始点X轴坐标
toXDelta 终点X轴坐标
fromYDelat 起始点Y轴坐标
toYDelta 终点Y轴坐标
关于AnimationSet集合效果,注意一点就行,AnimationSet继承自Animation类;当对AnimationSet设置属性时, 该容器下的所有动画效果都会受影响!
下面说几个常用的Animation类的方法:
reset 重置Animation初始化
cancel 开始Animation动画
start 开始Animation动画
setAnimationListener 给当前Animation设置动画监听
hasStarted 判断当前Animation是否开始
hasEnded 判断当前Animation是否结束
关于补间动画理论知识点还有一点需要注意:
补间动画执行之后,改变的是view的状态,而不是其属性,也就是说,当我们移动一个Button,并保持结束后的状态,当我们此时点击Button时,是不会触发OnClick事件的,当我们点击原始Button位置时,会触发onLick事件的。 此时如果我们需要点击Button改变后的位置而出发Onclick事件, 此时我们需要手动改变button的属性值!
由于补间动画我们平时用的不多,再次我只讲述一下属性动画的XML用法:
首先我们在res/anim/ 文件夹下创建一个名为tet_view_animation的Xml。(如果没有anim文件夹是需要自己创建的)
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:interpolator="@android:anim/bounce_interpolator"
android:fillAfter="true">
<translate
android:fromXDelta="0"
android:toXDelta="200"
android:fromYDelta="0"
android:toYDelta="200"
android:repeatCount="-1"
android:repeatMode="reverse">
translate>
<scale
android:fromXScale="0"
android:toXScale="1"
android:fromYScale="0"
android:toYScale="1"
android:repeatCount="-1"
android:repeatMode="reverse"/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:repeatCount="-1"
android:repeatMode="reverse"/>
set>
可以看到, 我创建了一个动画集合,然后动画无限重复(repeatCount=”-1”) ,由于repeatCount和repeatMode是共有的属性,那么为什么repeatCount和repeatMode不设置在set集合里呢?
这是因为在AnimationSet集合里设置repeatCount和repeatMode是无效的,应该设置在集合内部的动画中!这一点是值得注意的。
然后就是代码引用了:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.test_view_animation);
textView.startAnimation(animation);
这样我们的动画就会无限的循环了。
关于属性动画,这是我们在项目中经常用到的动画,属性动画基本可以替代补间动画。属性动画是改变view的属性值,比如:当我们改变一个Button之后,点击改变之后位置的Button,会触发onclick事件的。
属性动画常用的实现类:
ValueAnimator 在一个特定时间里执行一个动画
TimeAnimator 时序监听回调工具
ObjectAnimator 一个对象的一个属性动画
AnimatorSet 动画集合
其中TimeAnimator和ObjectAnimator都继承自ValueAnimator类;
AnimatorSet属性:
ordering:控制子动画启动的先后顺序。(sequentilally 子动画按照定义的先后顺序先后执行;together(默认):动画同时启动)
ValueAnimator属性:
valueTo:float int 或者color类型,必须要设置的节点属性,表明动画结束的点,如果是颜色,设置成6位十六进制的数字表示
valueFrom:相对应valueTo, 动画的起始点,如果没有指定,系统会通过属性的get方法获取。
duration:动画时长,int类型,单位:ms 默认300毫秒;
startOffset:动画延迟时间,从调用start方法后开始计算 单位:ms
repeatCount:一个动画重复的次数,int型, "-1"表示无限循环
repeatMode:重复的方式
valueType:关键参数,如果该value是一个颜色,那么就不需要制定,因为动画框架会自动处理颜色值。
ObjectAnimator属性同上。
与补间动画一样,属性动画也有平移,旋转,伸缩,透明等效果的动画。补间动画的共有属性,属性动画也是有的,在此不再赘述。
关于插值器附上以下几种:
AccelerateDecelerateInterolator:先加速后减速。
AccelerateInterpolator:加速。
DecelerateInterpolator:减速。
AnticipateInterpolator:先向相反方向改变一段再加速播放。
AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹。
BounceInterpolator:快到目标值时值会跳跃。
CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)。
LinearInterpolator:线性均匀改变。
OvershottInterpolator:最后超出目标值然后缓慢改变到目标值。
下面介绍两种定义属性动画的三种方式:
1:XML定义
首先在res/animator/ 目录下创建property_layout.xml,然后代码如下:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="translationX"
android:repeatMode="reverse"
android:repeatCount="-1"
android:valueFrom="0dp"
android:valueTo="200dp"/>
<objectAnimator
android:propertyName="translationY"
android:repeatMode="reverse"
android:repeatCount="-1"
android:valueFrom="0dp"
android:valueTo="200dp"/>
<objectAnimator
android:propertyName="rotation"
android:repeatMode="reverse"
android:repeatCount="-1"
android:valueFrom="0"
android:valueTo="360"
android:pivotX="50%"
android:pivotY="50%"/>
set>
可以看到我在每个子动画里面都设置了repeatMode和repeatCount;
然后在代码中引用该XML
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_layout);
set.setTarget(textView);
set.setDuration(2000);
set.start();
setTarget也就是将动画绑定在view上。
2:代码创建AnimatorSet集合,代码如下:
ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(textView, "translationX", 0, 200);
objectAnimatorX.setRepeatCount(-1);
objectAnimatorX.setRepeatMode(ValueAnimator.REVERSE);
ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(textView, "translationY", 0, 200);
objectAnimatorY.setRepeatMode(ValueAnimator.REVERSE);
objectAnimatorY.setRepeatCount(-1);
ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(textView, "rotation",0,360);
rotateAnimator.setRepeatCount(-1);
rotateAnimator.setRepeatMode(ValueAnimator.REVERSE);
final AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(objectAnimatorX).with(objectAnimatorY).with(rotateAnimator);
//animatorSet.setInterpolator(new BounceInterpolator());
animatorSet.start();
注意:上面的”translationX”,”translationY”,”rotation”字符串不能拼错,在项目中,可以将下述的字符串封装在常量类里
"translationX" X轴平移
"translationY" Y轴平移
"rotation" 旋转
"alpha" 透明度
"scaleX" X轴伸缩
"scaleY" Y轴伸缩
3:代码创建ObjectAnimator,开启动画
这种方法我自己用的不多,代码如下:
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);//透明度
PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0, 200);//平移
PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", 0, 200);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.5f, 1);//伸缩
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.5f, 1);
PropertyValuesHolder rotate = PropertyValuesHolder.ofFloat("rotation", 0, 360);//旋转
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(textView,alpha, translationX,
translationY,scaleX,scaleY,rotate);
objectAnimator.setRepeatCount(-1);//重复次数设置为无限循环
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);//设置循环模式 倒着循环
objectAnimator.setDuration(2000);//设置动画执行时间
objectAnimator.setInterpolator(new BounceInterpolator());//设置插值器
objectAnimator.start();
可以注意到:使用这个方法,只用设置一次repeatMode和repeatCount。
最后附上demo源码地址:
http://download.csdn.net/detail/lmq121210/9913849