参考资源:
Android 动画总结
1. 帧动画
即按照顺序播放一系列图片实现的动画效果。
效果图:
实现方式:
- 在
drawable
目录下创建三个位图,是三个要播放的图片
a_0.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z"
android:fillColor="#FF000000"/>
</vector>
a_1.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M5,16c0,3.87 3.13,7 7,7s7,-3.13 7,-7v-4L5,12v4zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3 12,3s-2.16,0.28 -3.09,0.75L6.6,1.44l-0.82,0.83 2.1,2.1C6.14,5.64 5,7.68 5,10v1h14v-1c0,-2.32 -1.14,-4.36 -2.88,-5.63zM9,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM15,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z"/>
</vector>
a_2.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:pathData="M17.6,11.48 L19.44,8.3a0.63,0.63 0,0 0,-1.09 -0.63l-1.88,3.24a11.43,11.43 0,0 0,-8.94 0L5.65,7.67a0.63,0.63 0,0 0,-1.09 0.63L6.4,11.48A10.81,10.81 0,0 0,1 20L23,20A10.81,10.81 0,0 0,17.6 11.48ZM7,17.25A1.25,1.25 0,1 1,8.25 16,1.25 1.25,0 0,1 7,17.25ZM17,17.25A1.25,1.25 0,1 1,18.25 16,1.25 1.25,0 0,1 17,17.25Z"
android:fillColor="@android:color/white"/>
</vector>
- 在
drawable
目录下创建anim1.xml
文件,用来设置图片的展示顺序以及duration(持续时间)
<?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="300" />
<item
android:drawable="@drawable/a_2"
android:duration="100" />
</animation-list>
- 在布局文件
activity_main.xml
中添加ImageView
组件,用来显示动画
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/animation1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 在java代码中设置动画
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView animationImg1 = findViewById(R.id.animation1);
animationImg1.setImageResource(R.drawable.anim1);
AnimationDrawable animationDrawable1 = (AnimationDrawable) animationImg1.getDrawable();
animationDrawable1.start();
}
}
2. 补间动画
补间动画(Tween),和前面学的帧动画不同,帧动画 是通过连续播放图片来模拟动画效果,而补间动画开发者只需指定动画开始,以及动画结束"关键帧", 而动画变化的"中间帧"则由系统计算并补齐!
Andoird所支持的补间动画效果有如下这四种,分别为:
AlphaAnimation
:透明度渐变效果,创建时指定开始以及结束透明度,还有动画的持续时间,透明度的变化范围[0, 1],0是完全透明,1是完全不透明;对应alpha标签!ScaleAnimation
:缩放渐变效果,创建时需指定开始以及结束的缩放比,以及缩放参考点, 还有动画的持续时间;对应scale标签!TranslateAnimation
:位移渐变效果,创建时指定起始以及结束位置,并指定动画的持续 时间即可;对应translate标签!RotateAnimation
:旋转渐变效果,创建时指定动画起始以及结束的旋转角度,以及动画 持续时间和旋转的轴心;对应rotate标签!
AlphaAnimation:透明度动画(用来实现透明度渐变效果)
效果图:
- 首先在
src/main/res/anim
下创建动画alpha_1.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="1"
android:toAlpha="0" />
- 在布局文件中添加一个
ImageView
略 - 为
ImageView
设置动画
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.animation1);
imageView.setImageResource(R.drawable.p1);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha_1);
// 重复动画 INFINITE 无限循环
animation.setRepeatCount(Animation.INFINITE);
imageView.startAnimation(animation);
}
}
ScaleAnimation:缩放动画(用来实现缩放渐变效果)
效果图:
- 创建动画文件
anim/scale_anim.xml
,实现图片等比从无放大到原来的1.5倍的效果
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="0"
android:toXScale="1.5"
android:fromYScale="0"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"/>
- 在布局文件中添加一个
ImageView
略 - 为
ImageView
设置动画
略
TranslateAnimation:平移动画(用来实现位移渐变效果)
- 创建动画文件
anim/translate_anim.xml
,实现图片沿对角线位移
坐标原点应该是View的左上角,好像是。
- 创建动画文件
anim/translate_anim.xml
,实现图片沿对角线位移
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="500"
android:toYDelta="500" />
- 在布局文件中添加一个
ImageView
略 - 为
ImageView
设置动画
略
效果图:
RotateAnimation:旋转动画(用来实现旋转渐变效果)
- 创建动画文件
anim/rotate_anim.xml
,实现图片中心旋转
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="0" />
- 在布局文件中添加一个
ImageView
略 - 为
ImageView
设置动画
略
效果图:
AnimationSet:可以同时使用多种动画组合
如实现透明度从0到1,同时从0放到到原来的1.5倍的动画如下。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="2000"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5" />
<alpha
android:duration="2000"
android:fromAlpha="0"
android:toAlpha="1" />
</set>