概述
在Android中,我们需要利用已有的一些资源来完成一些炫酷的动画效果,那么此时我们就需要去熟悉Android已有的对动画的支持的API,今天总结一下Android动画中的第二种动画,属性动画
属性动画简介
在Android中,动画分为2大类,视图动画(View Animation)和属性动画(Object Animation),而属性动画又分为2类,ValueAnimator和ObjectAnimator。
重点注意
使用之前需要先记住,视图动画是不会改变控件原本的属性的,举个栗子,如果我们使用平移动画将一个按钮平移,且最后图像显示是平移后的位置,但其实实际的点击事件响应位置还是在原本位置,平移后的位置点击事件是无法响应的。这点是视图动画和属性动画最大的区别
ValueAnimator
首先我们在代码中来简单的实现一下,和视图动画一样,在播放完毕后一定要使用cancel()方法进行动画的关闭,否则会造成内存泄漏,关键代码如下,
private void startValueAnim(){
ValueAnimator animator ;
if (binding.image.getLeft()>0){
animator = ValueAnimator.ofInt(500,0);
}else {
animator = ValueAnimator.ofInt(0,500);
}
animator.setDuration(500);
animator.setInterpolator(new BounceInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (int) animation.getAnimatedValue();
binding.image.layout(currentValue,currentValue,currentValue+binding.image.getWidth(),currentValue+binding.image.getHeight());
}
});
animator.start();
}
先看一下运行结果
其实ValueAnimator的主要用途是自己来构建一个值变化的动画类,我们在监听值的变化时来对控件做对应的位置或者其他变换操作。
ValueAnimator的几个重要构造方法
- ValueAnimator ofInt(int... values)
- ValueAnimator ofFloat(float... values)
这俩呢,就主要是用在构造几个数值变换的动画中,比如我可以创建一个ValueAnimator,先从0变到400,再从400到200,再从200到500,那么我就只需要按如下方式创建
ValueAnimator animator = ValueAnimator.ofInt(0,400,200,500);
ValueAnimator的几个常用的方法
- ValueAnimator setDuration(long duration) 设置动画时间
- void setInterpolator(TimeInterpolator value) 设置插值器,控制动画速度
- void setRepeatCount(int value) 动画重复次数
- void setRepeatMode(int value) 动画重复方式
- setStartDelay(long startDelay) 动画延迟播放的时间
- Object getAnimatedValue() 获取当前播放的动画的值
...
ValueAnimator的监听
- addUpdateListener(AnimatorUpdateListener listener) 监听该动画值变化
- void removeUpdateListener(AnimatorUpdateListener listener) 取消监听该动画值变化
- void removeAllUpdateListeners() 取消该动画所有监听值变化
- void addListener(AnimatorListener listener) 监听该动画的播放/结束/取消/重复状态
- void removeListener(AnimatorListener listener) 取消该动画状态监听
- void removeAllListeners() 取消该动画所有状态监听
总结
ValueAnimator对控件的属性修改主要还是靠自己来修改的,所以比较灵活,我们只要关心动画值即可,运用度还是比较高的。下一篇写一个简单的ValueAnimator的实际应用。