android 动画详解

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

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

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

一:补间动画

动画效果有: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文件夹是需要自己创建的)

<?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方法后开始计算 单位: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,然后代码如下:

<?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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值