持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
在讲解动画之前来一张思维导图
Android的动画大体分为视图动画和属性动画两种,帧动画是一种特殊的动画。
-
视图动画
- 动画效果实际位置没有发生改变,只是视觉上的变化(布局没有发生改变)
- 其主要用途是发生在一些视图切换的场景
-
属性动画
- 可以实现一个view其位置的真正改变
-
帧动画
- 可以理解为一组图片进行轮播,当速度很快的时候就形成了动画
视图动画
视图动画既可以以xml的格式来写,也可以在java代码中动态配置
xml方式
基础流程
-
在res目录下新建名为anim的文件夹
然后新建Animation Resouse File
之后选择动画类型(对应思维导图)
2.编写动画
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYScale="100%"
android:fromXScale="100%"
android:toYScale="30%"
android:toXScale="30%"
android:pivotY="0.5"
android:pivotX="0.5"
android:duration="1000"
/>
3.在Java代码中使用动画
Animation anmiation=AnimationUtils.loadAnimation(this,R.anim.scale);
view.startAnimation(animation);
之后就可以看到实际的动画效果了,这就是使用视图动画的基础流程
动画类型讲解
1.Scale放缩动画
fromXScale/fromYScale 动画起始时在X/Y方向上相对自身的放缩比例
toXscale/toYScale 与上一个属性相反
此属性的值为一个浮点值 eg:0.5代表缩小一倍
PivotX/Y :放缩的起始轴心 一般取值为百分数 例如50%从中心开始放缩
但是除此之外,他也有其他类型的取值如 50 和 50%p 均有不同的涵义
- 百分比 :相对于当前View的百分比,例如50%就在当前View中心
- 数值:相对于Android坐标系的位置
android坐标系取左上角为原点,向右为x的正方向,向下为y的正方向
- 百分比p: p为Parent的意思,表示在当前控件的左上角加上父控件宽 50%作为缩放起始点 坐标
2.Alpha透明度动画
- fromAlpha/toAlpha 取值在0-1之间,也是一个浮点数
3.rotate旋转动画
- fromDegrees/toDegrees
正值代表顺时针,反之亦然
- pivotX/pivotY
旋转中心,与Scale里面的属性类似
4.translate 平移动画
fromXDelta/fromYDelta 平移的起始位置 toXDelta/toYDelta 结束时的位置
取值依然是三种取值 (数值 百分比 百分比P)
5.set
set动画就是以上动画合集,可以让动画以组合的形式同时播放
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="1000"/>
<translate
android:fromXDelta="-100%"
android:toXDelta="0"
android:duration="200">
</translate>
<scale
android:fromYScale="100%"
android:fromXScale="100%"
android:toYScale="30%"
android:toXScale="30%"
android:pivotY="0.5"
android:pivotX="0.5"
android:duration="1000"
/>
</set>
属性动画的其他API
duration:动画时间
fillAfter:动画是否保持结束时的样子
fillBefore:动画是否还原到原来的样子
repeatCount:动画的重复次数
repeatMode:动画重复类型 ,可选:reverse 和restart
代码实现
实现代码
ScaleAnimation animation=new ScaleAnimation(0,0,10,10);
animation.setDuration(200);
imageView.startAnimation(animation);
方法的重载参数和前面介绍的基本类似
而前面的对动画配置的一些api在代码中可以用一系列的set方法实现
其他类型的动画类型也是一样如法炮制
动画监听
ScaleAnimation animation=new ScaleAnimation(0,0,10,10);
animation.setDuration(200);
imageView.startAnimation(animation);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
动画插值器
动画插值器用来决定动画随时间的速度 ,有匀速的、加速的、减速的、弹跳的 也是在set类函数中实现的
alphaAnim . setinterpolator (new Linearinterpolator ());