Android 动画分类:
- 传统动画
- 帧间动画
- 补间动画
- 属性动画
ObjectAnimator 和 ValueAnimator
帧动画
帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源,他的原理就是将一张张单独的图片连贯的进行播放,
在res->drawalbe 目录下创建动画对应的frame_animation.xml(animation-list)
imageView.setImageResource()指定帧动画
imaggeView.getDrawable() 获取AnimationDrawable
AnimationDrawable.start()开始动画
iv_imageView.setImageResource(R.drawable.frame_animation);
AnimationDrawable animationDrawable = (AnimationDrawable)iv_animation.getDrawable();
if(animationDrawable != null){
animationDrawable.start();
}
补间动画
补间动画又可以分为四种形式,分别是 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。
补间动画的实现,一般会采用xml 文件的形式;代码会更容易书写和阅读,同时也更容易复用
使用过程:
1. 在res->anim目录下建立 对应的xml 补间动画
scale_anim.mxl
anim_set.xml 补间动画组合
-
调用 补间动画
//(1) 透明度变化
// Animation animationAlhpa = AnimationUtils.loadAnimation(this,R.anim.alpha_anim);
// iv_animation.startAnimation(animationAlhpa);
//(2) 放缩动画
//Animation animationScale = AnimationUtils.loadAnimation(this,R.anim.scale_anim);
//iv_animation.startAnimation(animationScale);
//(3)组合 动画
Animation animation_set = AnimationUtils.loadAnimation(this,R.anim.anim_set);
iv_animation.startAnimation(animation_set);
属性动画
属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可以通过属性动画实现。
ObjectAnimator
//(1) 属性动画之 - 旋转
ObjectAnimator animator_rotate = ObjectAnimator.ofFloat(iv_animation,"rotation",0f,270f);
animator_rotate.start();
// (2) 属性动画之 - alpha
ObjectAnimator animator_alpha = ObjectAnimator.ofFloat(iv_animation,"alpha",1.0f,0.5f);
animator_alpha.start();
//(3)属性动画之 - 组合动画
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(iv_animation,"alpha",0.2f,1.0f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(iv_animation,"scaleX",0.5f,1.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(iv_animation,"scaleY",0.5f,1.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(iv_animation,"rotation",0,360);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(iv_animation,"translationX",100,400);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(iv_animation,"translationY",100,750);
AnimatorSet set = new AnimatorSet();
set.playTogether(alphaAnim,scaleXAnim,scaleYAnim,rotateAnim,transXAnim,transYAnim);
set.setDuration(3000);
set.start();
ValueAnimator
ValueAnimator是ObjectAnimator的基础。本质上是一个插值器。
指定开始值、结束值、和时间周期。ValueAnimator 就能产生从开始值到结束值之间变化的插值值animation.getAnimatedValue。
你可以通过获得的插值 来设置一个甚至多个View的任何属性。从而实现单个单个视图某个属性或多个属性的变化。
必要时还可以实现 多个视图View 共同变化的动画组。非常nice~
final ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
/**
* 通过这样一个监听事件,我们就可以获取
* 到ValueAnimator每一步所产生的值。
*
* 通过调用getAnimatedValue()获取到每个时间因子所产生的Value。
* */
Integer value = (Integer) animation.getAnimatedValue();
btn_click.setText(value + "");
}
});
animator.start();