android 动画详解

来源:互联网 发布:购买域名的网站 编辑:程序博客网 时间:2024/06/14 04:40

工作一年了 ,用的动画也不少,但是没有总结过关于动画的知识,今天可以总结一下,
首先 动画分为三种

  • View Animation 补间动画
  • Drawable Animation 帧动画
  • Property Animation 属性动画

今天我主要总结一下补间动画和属性动画的用法。

一:补间动画

动画效果有:AlphaAnimation(透明), ScaleAnimation(伸缩) ,RotateAnimation(旋转), TransLateAnimation(平移); 有时候我们希望一种动画:既有透明,又有伸缩等效果,我们可以通过AnimationSet(集合) 动画集合的方式来实现。这五种效果不仅补间动画有,属性动画也有。

首先看下补间动画效果共有的属性值:

duration 动画持续时间,单位:msfillAfter 动画结束时是否保持最后状态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文件夹是需要自己创建的)

<?xml version="1.0" encoding="utf-8"?><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>    <!--<rotate-->        <!--android:fromDegrees="0"-->        <!--android:toDegrees="50"-->        <!--android:repeatCount="-1"-->        <!--android:repeatMode="reverse"/>-->    <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方法后开始计算 单位:msrepeatCount:一个动画重复的次数,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,然后代码如下:

<?xml version="1.0" encoding="utf-8"?><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

原创粉丝点击