【Code-Snippet】Anim

总的来讲,Android动画能够分为两类,最初的传统动画和Android3.0 以后出现的属性动画; 传统动画又包括 帧动画(Frame Animation)和补间动画(Tweened Animation)。java

1. View Animator

Animation类 是全部动画(scale、alpha、translate、rotate)的基类,这里以scale标签为例,讲解一下,Animation类所具备的属性及意义。android

  • android:duration 动画持续时间,以毫秒为单位
  • android:fillAfter 若是设置为true,控件动画结束时,将保持动画最后时的状态
  • android:fillBefore 若是设置为true,控件动画结束时,还原到开始动画前的状态
  • android:fillEnabled 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
  • android:repeatCount 重复次数
  • android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示从新放一遍,必须与repeatCount一块儿使用才能看到效果。由于这里的意义是重复的类型,即回放时的动做。
  • android:interpolator 设定插值器,其实就是指定的动做效果,好比弹跳效果等,不在这小节中讲解,后面会单独列出一单讲解。

分类bash

1.1 alpha 渐变透明度动画效果

  • android:fromAlpha 动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示彻底不透明
  • android:toAlpha 动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示彻底不透明

Example:ide

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="5000"
        android:fromAlpha="1.0" android:toAlpha="0.1"/>
</set>
复制代码
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.1f);
复制代码

1.2 scale 渐变尺寸伸缩动画效果

XML参数说明:动画

  • android:fromXScale 起始的X方向上相对自身的缩放比例,浮点值,好比1.0表明自身无变化,0.5表明起始时缩小一倍,2.0表明放大一倍;
  • android:toXScale 结尾的X方向上相对自身的缩放比例,浮点值;
  • android:fromYScale 起始的Y方向上相对自身的缩放比例,浮点值,
  • android:toYScale 结尾的Y方向上相对自身的缩放比例,浮点值;
  • android:pivotX 缩放起点X轴坐标,能够是数值、百分数、百分数p 三种样式,好比 50、50%、50%p,当为数值时,表示在当前View(若是当前为按键点击来切换页面,则这个View是button)的左上角,即原点处加上50px,作为起始缩放点;若是是50%,表示在当前控件的左上角加上本身宽度的50%作为起始点;若是是50%p,那么就是表示在当前的左上角加上父控件宽度的50%作为起始点x轴坐标。
  • android:pivotY 缩放起点Y轴坐标,取值及意义跟android:pivotX同样。 关于pivotX和pivotY设置为'%p'的时候的原点为屏幕的左上角,向右为x正方向,向下为y正方向

Example:ui

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="5000"
        android:fromXScale="1.0" android:fromYScale="1.0"
        android:pivotX="50%" android:pivotY="50%"
        android:toXScale="1.5" android:toYScale="1.5"/>
</set>
复制代码
ImageView img =  (ImageView) findViewById(R.id.img);
Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
img.startAnimation(scaleAnimation);
复制代码

也能够直接用代码设置:this

ScaleAnimation scaleAnim2 = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
复制代码

1.3 translate 画面转换位置移动动画效果

  • android:fromXDelta 起始点X轴坐标,能够是数值、百分数、百分数p 三种样式,好比 50、50%、50%p,具体意义已在scale标签中讲述,这里就再也不重讲
  • android:fromYDelta 起始点Y轴从标,能够是数值、百分数、百分数p 三种样式;
  • android:toXDelta 结束点X轴坐标
  • android:toYDelta 结束点Y轴坐标

1.4 rotate 画面转移旋转动画效果

  • android:fromDegrees 开始旋转的角度位置,正值表明顺时针方向度数,负值代码逆时针方向度数
  • android:toDegrees 结束时旋转到的角度位置,正值表明顺时针方向度数,负值代码逆时针方向度数
  • android:pivotX 缩放起点X轴坐标,能够是数值、百分数、百分数p 三种样式,好比 50、50%、50%p,具体意义已在scale标签中讲述,这里就再也不重讲
  • android:pivotY 缩放起点Y轴坐标,能够是数值、百分数、百分数p 三种样式,好比 50、50%、50%p

1.5 Animation Set

AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.1f);
ScaleAnimation scaleAnim2 = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
RotateAnimation rotateAnim = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 
    0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
xy.addAnimation(alphaAnim);
xy.addAnimation(rotateAnim);
xy.addAnimation(scaleAnim2);
xy.setDuration(3000);
btn_xml.startAnimation(xy);
复制代码

2. Property Animation

Property Animation 也能够用xml来定义,property的xml放在 res/animator 下。spa

2.1 xml设置

  • alpha
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:propertyName="alpha"
    android:valueType="floatType"
     />
复制代码
  • sets
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <objectAnimator
        android:duration="1000"
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:repeatCount="1"
        android:repeatMode="reverse"/>
    <objectAnimator
        android:duration="1000"
        android:valueFrom="1.0"
        android:valueTo="3.0"
        android:valueType="floatType"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:propertyName="scaleX"/>
</set>
复制代码
  • Java代码中调用

载入 ObjectAnimator 动画 (1)经过AnimatorInflater.loadAnimator载入, (2)注意须要设置 setTarget (3)和代码同样的道理,属性值也能够在代码中动态修改 (4)新建的动画类的类别必须跟XML文件中的根标签对应rest

ObjectAnimator xxx = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this,
        R.animator.test_object_animator);
xxx.setTarget(v);
xxx.start();
复制代码

2.2 java设置

  • 设置单一的 ObjectAnimator
ObjectAnimator anim = ObjectAnimator                //新建ObjectAnimator
        .ofFloat(v, "alpha", 1.0f, 0.0f,1.0f)        //设置变化的值从3.0f到0.0f
        .setDuration(1000);                          //设置变化时间
anim.setRepeatCount(1);                             //设置重复次数
anim.setRepeatMode(ObjectAnimator.REVERSE);         //设置重复模式
anim.setTarget(v);                                  //绑定控件,能够不用设置
btn_java.setPivotX(0);                              //设置变化的中心
btn_java.setPivotX(0);
anim.start();                                       //开启动画
复制代码
  • 设置单一的动画,ValueAnimator,必需要在addUpdateListener中更新控件的属性,否则没有任何效果
ValueAnimator animator = ValueAnimator
        .ofFloat(3.0f,0.0f)
        .setDuration(1000);
animator.setRepeatCount(1);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setTarget(v);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float x = (Float) animation.getAnimatedValue();
        v.setAlpha(x);                           //设置透明度
        v.setScaleX(x);                          //设置X轴
        v.setScaleY(x);                          //设置Y轴
    }
});
复制代码
  • 设置动画集,AnimatorSet
AnimatorSet set = new AnimatorSet();
set.setDuration(1000);
set.play(anim);
set.play(animator);
set.playTogether(anim, animator);    //设置两个动画一块儿运行
set.start();
复制代码
相关文章
相关标签/搜索