Android动画 | 青训营笔记

78 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第8天

Android动画分为帧动画,补间动画和属性动画

1、帧动画

帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源,他的原理就是将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果;有点类似于某些软件制作gif动画的方式。代码要做的事情就是把一幅幅的图片按顺序显示,造成动画的视觉效果。

帧动画实现:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item
     android:drawable="@drawable/a_0"
     android:duration="100" />
  <item
     android:drawable="@drawable/a_1"
     android:duration="100" />
  <item
     android:drawable="@drawable/a_2"
     android:duration="100" />
</animation-list>
​
protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_frame_animation);
    
  ImageView animationImg1 = (ImageView) findViewById(R.id.animation1);
  animationImg1.setImageResource(R.drawable.frame_anim1);
  AnimationDrawable animationDrawable1 = (AnimationDrawable) animationImg1.getDrawable();
  animationDrawable1.start();
}
​

2、补间动画

补间动画又可以分为四种形式,分别是 alpha(淡入淡出),translate(位移), scale(缩放大小),rotate(旋转)。 补间动画的实现,一般会采用xml 文件的形式.

alpha_anim.xml 动画实现:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toAlpha="0.0" />

scale.xml 动画实现:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0"/>

然后,在Activity中:

Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
img = (ImageView) findViewById(R.id.img);
img.startAnimation(animation);

这样就可以实现ImageView alpha 透明变化的动画效果。也可以使用set 标签将多个动画组合.

三、属性动画

属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可 以通过属性动画实现。

首先我们来看看如何用属性动画实现上面补间动画的效果

private void RotateAnimation() {
   ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
   anim.setDuration(1000);
   anim.start();
}
private void AlpahAnimation() {
   ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.8f, 0.6f, 0.4f, 0.2f, 0.0f);
   anim.setRepeatCount(-1);
   anim.setRepeatMode(ObjectAnimator.REVERSE);
   anim.setDuration(2000);
   anim.start();
}
​

这两个方法用属性动画的方式分别实现了旋转动画和淡入淡出动画,其中 setDuration、setRepeatMode及setRepeatCount和补间动画中的概念是一样的。可以看到,属性动画貌似强大了许多,实现很方便,同时动画可变化的值也有了更 多的选择,动画所能呈现的细节也更多。