您的位置:首页 > 移动开发 > Android开发

Android属性动画(Property Animation)

2016-06-08 16:09 387 查看
在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property Animator(属性动画);

其中

View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);

Property Animator包括ValueAnimator和ObjectAnimation;

闲来无事来了解一下属性动画,这里作为学习笔记吧

1. ObjectAnimator

先来个小例子

ObjectAnimator.ofFloat(iv_image,"rotationY",0,180)
.setDuration(1500)
.start();


代码的作用是把iv_image在1500毫秒时间内旋转绕y轴180度

几个参数应该能看懂,至于第二个看下面…

这是view下面的相关动画方法

//1、透明度:alpha
public void setAlpha(float alpha)

//2、旋转度数:rotation、rotationX、rotationY
public void setRotation(float rotation)
public void setRotationX(float rotationX)
public void setRotationY(float rotationY)

//3、平移:translationX、translationY
public void setTranslationX(float translationX)
public void setTranslationY(float translationY)

//缩放:scaleX、scaleY
public void setScaleX(float scaleX)
public void setScaleY(float scaleY)


可以看出第二个参数和这些方法有关,ObjectAnimator根据第二个参数,查找setXXX方法,把后面的数据参数放入方法执行,因此该方法可在view中自定义,也可用原生动画方法。具体参数名应按照驼峰命名法。

2.ValueAnimator

先来简单了解一下使用方法

ValueAnimator animator = ValueAnimator.ofInt(0,400);
animator.setDuration(1000);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int)animation.getAnimatedValue();
tv.layout(curValue,curValue,curValue+tv.getWidth(),curValue+tv.getHeight());
Log.d("Richard","curValue:"+curValue);
}
});
animator.start();


可以看出 ValueAnimator的作用:

只负责对指定的数字区间进行动画运算
我们需要对运算过程进行监听,然后自己对控件做动画操作


常用方法

public static ValueAnimator ofInt(int... values)
public static ValueAnimator ofFloat(float... values)

/**
* 设置动画时长,单位是毫秒
*/
ValueAnimator setDuration(long duration)
/**
* 获取ValueAnimator在运动时,当前运动点的值
*/
Object getAnimatedValue();
/**
* 开始动画
*/
void start()
/**
* 设置循环次数,设置为INFINITE表示无限循环
*/
void setRepeatCount(int value)
/**
* 设置循环模式
* value取值有RESTART,REVERSE,
*/
void setRepeatMode(int value)
/**
* 取消动画
*/
void cancel()


* 两个监听器 *

/**
* 监听器一:监听动画变化时的实时值
*/
public static interface AnimatorUpdateListener {
void onAnimationUpdate(ValueAnimator animation);
}
//添加方法为:public void addUpdateListener(AnimatorUpdateListener listener)
/**
* 监听器二:监听动画变化时四个状态
*/
public static interface AnimatorListener {
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
//添加方法为:public void addListener(AnimatorListener listener)

/**
* 移除AnimatorUpdateListener
*/
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
/**
* 移除AnimatorListener
*/
void removeListener(AnimatorListener listener);
void removeAllListeners();


其他方法

/**
* 延时多久时间开始,单位是毫秒
*/
public void setStartDelay(long startDelay)
/**
* 完全克隆一个ValueAnimator实例,包括它所有的设置以及所有对监听器代码的处理
*/
public ValueAnimator clone()


插值器

插值器,也叫加速器;下面看看下面几种插值器



意义如下:

AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速

AnticipateInterpolator 开始的时候向后然后向前甩

AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

BounceInterpolator 动画结束的时候弹起

CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator 在动画开始的地方快然后慢

LinearInterpolator 以常量速率改变

OvershootInterpolator 向前甩一定值后再回到原来位置

以弹跳插值器为例:

ValueAnimator animator = ValueAnimator.ofInt(0,600);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int)animation.getAnimatedValue();
tv.layout(tv.getLeft(),curValue,tv.getRight(),curValue+tv.getHeight());
}
});
animator.setDuration(1000);
animator.setInterpolator(new BounceInterpolator());//插值器的应用方法
animator.start();


这就是插值器的简单用法,当然我们也可以自己定义我们想要的插值器

public class MyInterploator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
return 1-input;
}
}


实现的getInterpolation()方法就用来根据属性动画传进来的值,进行我们自己的计算,input为动画进行的进度

Evaluator
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  属性动画 android