Android动画系列

Android动画主要分为三种:

  • View Animation:视图动画也叫tween(补间动画),只能被用来设置view的动画
  • Drawable Animation: frame动画或逐帧动画,专门用来显示一个个的Drawable,像放幻灯片一样
  • Property Animation:属性动画,只对Android3.0(api 11)以上生效,这种动画可以给任何Object,这种动画可扩展,可以自定义任何类型和属性

视图动画

一、 View Animation概述

视图动画也叫补间动画,该动画可以在一个视图容器内执行一系列的简单变换(位置、大小、平移、旋转),补间动画通过XML或Android代码定义,一般建议用XML文件来定义,因为它更具可读性、可重用性;

java类名 xml关键字 描述
AlphaAnimation 放置在res/anim/目录下 透明度渐变效果
RotateAnimation 放置在res/anim/目录下 画面旋转效果
TraslateAnimation 放置在res/anim/目录下 画面位置移动效果
ScaleAnimation 放置在res/anim/目录下 尺寸伸缩效果
AnimationSet 放置在res/anim/目录下 一个包含其他动画元素alpha、ratate、traslate、scale或者其他set元素的容器

二、属性和方法说明

1、 可以看出Animation抽象类是所有补间动画类的基类,接下来我们看看基类提供的一些通用的属性吧。

xml属性 java方法 描述
android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
android:duration setDuration(long) 动画持续时间
android:fillAfter setFillAfter(boolean) 控制动画结束时是否保持动画最后的状态
android:fillBefore setFillBefore(boolean) 控制动画结束是否还原动画开始前的状态
android:interpolator setInterpolater(interpolator) 设置插值器(指定动画执行速度、譬如线性执行,加速执行等)
android:repeatCount setRepeatCount(int) 重复次数
android:repeatMode setRepeatMode(int) 设置重复类型:reverse倒序回放、restart从头播放
android:startOffset setOffset(long) 延迟多少毫秒开始执行动画,单位为毫秒
android:zAdjustment setAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal

2、 接下来分别看看每种补间动画特有的属性和方法说明

a、 Alpha属性详解

下面的java方法是构造函数传参数

xml属性 java方法 描述
android:fromAlpha AlphaAnimation(float fromAlpha,…) 动画的开始透明度0.0-1.0,0.0为全透明,1.0为全不透明
android:toAlpha AlphaAnimation(…,float fromAlpha) 动画结束的透明度同上

b、Rotate属性详解

xml属性 java方法 描述
android:fromDegrees RatateAnimation(float fromDegrees,…) 旋转开始角度,正数代表顺时针旋转,负数代表逆时针旋转
android:toDegrees RatateAnimation(…,float toDegrees) 旋转结束角度同上
android:pivotX RatateAnimation(…,float pivotX,…) 旋转起点x坐标 (数值、百分数、百分数p,譬如50表示以当前view左上角坐标加50dp为起始点、50%表示以当前view左上角坐标加宽高的50%为起始点、50%p表示以当前view左上角坐标加父控件宽高的50%作为起点)
android:pivotY RatateAnimation(…,float toDegrees) 旋转起点y坐标 (同上)

c、Scale属性详解

xml属性 java方法 描述
android:fromXScale ScaleAnimation(float fromX,…) 初始x轴缩放比例(1.0表示无变化)
android:toXScale ScaleAnimation(…,float toX,…) 结束时x轴的缩放比例
android:fromYScale ScaleAnimation(…,float fromY,…) 初始y轴缩放比例(1.0表示无变化)
android:toYScale ScaleAnimation(…,float toY,…) 结束时y轴的缩放比例
android:pivotX ScaleAnimation(…,float pivotX,…) 同Rotate
android:pivotY ScaleAnimation(…,float pivotY,…) 同Rotate

d、 translate属性详解

xml属性 java方法 描述
android:fromXDelta TranslateAnimation(float fromXDelta,…) 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:toXDelta TranslateAnimation(…,float toX,…) 结束时x轴的坐标(同上)
android:fromYDelta ScaleAnimation(…,float fromY,…) 起始点y轴坐标(同上)
android:toYDelta ScaleAnimation(…,float toY,…) 结束点y轴坐标(同上)

e、 AnimationSet几层自Animation是上面四种动画元素的容器管理类,没有自己特有的属性,他的属性集成自Animation,所以当我们对set标签使用Animation的属性时会对该标签下的所有元素都产生影响

三、补间动画使用方法及示例代码

xml的使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
<scale
android:fromXScale="200dp"
android:fromYScale="200dp"
android:pivotX="0"
android:pivotY="0"
android:toXScale="500dp"
android:toYScale="500dp"
/>
<translate
android:fromXDelta="10%"
android:fromYDelta="10%"
android:toXDelta="300%"
android:toYDelta="300%"
/>
<rotate
android:fromDegrees="10"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="70"
/>
</set>

Android代码中调用:

1
2
3
Button btn = (Button) findViewById(R.id.wheelView);
Animation animator = AnimationUtils.loadAnimation(this, R.anim.out);
btn.startAnimation(animator);

通过AnimationUtils来加载上述的xml动画资源

android 代码的使用方式:

这里只示范了AlphaAnimation的使用,其他三种类型的使用也是一样

1
2
3
4
Button btn = (Button) findViewById(R.id.wheelView);
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(2000);
btn.startAnimation(alphaAnimation);

此外Animation还有一些比较实用的方法

Animation类的方法 描述
reset() 重置动画
cancle() 取消动画
start() 开始动画
setAnimationListener(AnimationListener listener)) 给当前动画设置监听
hasStarted() 判断当前动画是否开始
hasEnded() 判断当前动画是否介绍

既然补间动画只能给view使用,那我们来看看view中和动画相关的几个常用方法吧

view类常用动画操作方法 描述
startAnimation(Animation animation) 开始动画
clearAnimation(Animation animation) 取消动画

四、补间动画注意事项

补间动画执行后并未改变view的真实布局属性值,譬如当我们在activity中有个button在屏幕上方,我们设置平移动画后移动到屏幕下方,然后报纸动画最后执行状态保留在屏幕下方,这时如果点击屏幕下方动画执行后的button是没有任何反应的,而点击原来屏幕上方没有button的地方却响应的是点击button的事件

至此整个Android的不见动画常用属性和方法介绍完了。

Drawable动画

Drawable动画其实就是Frame动画,他允许你实现像播放幻灯片一样的效果,这种动画其实就是一张张的drawable的叠加,这种动画继承自Drawable,所以AnimationDrawable本质上还是Drawable。所以xml定义的动画一般放在res/drawable/目录下

Drawable动画的xml实现方式

Drawable动画可以使用xml或者java方式实现,但是依然推荐使用xml方式

先附上一段代码示例drawable_anim.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/animation_start_1"
android:duration="200"/>
<item
android:drawable="@mipmap/animation_start_2"
android:duration="200"/>
<item
android:drawable="@mipmap/animation_start_3"
android:duration="200"/>
<item
android:drawable="@mipmap/animation_start_4"
android:duration="200"/>
<item
android:drawable="@mipmap/animation_start_5"
android:duration="200"/>
<item
android:drawable="@mipmap/animation_start_6"
android:duration="200"/>
</animation-list>

注意drawable_anim.xml 文件位于res/drawable/目录下
animation-list 必须是根节点,包含一个或者多个item元素,其属性有:

  • android:oneshot=true表示只执行一次,false表示循环执行
  • item 类似一帧的动画资源

item是animation-list的子项,包含属性如下:

  • android:drawable 一个frame的Drawable资源。
  • android:duration 一个frame显示多长时间。

然后在activity中的代码调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView rocketImage = (ImageView) findViewById(R.id.drawable_anim);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}

Drawable动画的代码实现方式

所谓的代码实现方式,只是把在xml中添加drawable换成了代码方式添加。

1
2
3
4
5
6
7
8
9
10
AnimationDrawable animationDrawable1 = new AnimationDrawable();
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_1), 200);
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_2), 200);
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_3), 200);
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_4), 200);
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_5), 200);
animationDrawable1.addFrame(getResources().getDrawable(R.mipmap.animation_start_6), 200);
animationDrawable1.setOneShot(false);
show.setBackground(animationDrawable1);
animationDrawable1.start();

addFrame(@NonNull Drawable frame, int duration)顾名思义 增加一帧动画到动画中,第一个参数是需要添加的drawable对象,第二个参数是该动画的停留时间。
以上就是Drawable的全部知识点了。

最后有个注意事项:start()方法不能在oncreate中调用,因为AnimationDeawable还没有完全依附在window上,所以最好的调运时机是onWindowFocusChanged()方法中

该动画的内容比较少,相对简单。

属性动画

Android3.0以后引入了属性动画,所谓的属性动画其实就是修改控件的属性值而实现的动画,补间动画和drawable动画实现的效果有限,所以功能比它们要强大的多,也要复杂的多

我们先来看下属性动画的类关系:

类图

也就是所有的属性动画的基类就是Animator,所以可以看见我们平时使用的属性动画重点就在于ValueAnimator、TimeAnimator、ObjectAnimator、AnimatorSet。

属性动画XML实现方式

同样属性动画有xml和纯代码两种实现方式,我们先来看xml的实现方式
在xml中可直接使用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet,而TimeAnimator不能在xml中作为节点使用,属性动画的xml文件需要放置在/res/animator/目录下,注意不是/res/anim/,/res/anim/是放置补间动画的目录。这需要区分开。

ValueAnimator 在xml中对应的是animator标签
ObjectAnimator在xml中对应的objectAnimator标签
AnimatorSet在xml中对应的是set标签
实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="800"
android:propertyName="alpha"
android:repeatCount="10000000"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType"
/>
<animator
android:duration="800"
android:repeatCount="10000000"
android:valueFrom="0.0"
android:valueTo="1000.0"
android:valueType="floatType"/>
</set>

下面对各个属性进行分别解释
set标签属性解释:

xml属性 解释
android:ordering 控制动画启动顺序:sequentially动画按照先后顺序启动;together(默认):动画同时启动
xml属性 解释
android:properName String类型,必须要设置的节点属性,代表要执行动画的属性,譬如可以执行一个控件的“alpha”或者一些其他自定义的属性
android:valueFrom 动画起始点,与valueTo相对,如果没有设置,则系统通过属性的get方法获取,如果是颜色的话由6位16进制的数字表示
android:valueTo float、int或者color类型,必须要设置,表明动画结束的值,如果是颜色的话由6位16进制的数字表示
android:duration 动画执行的时长,int类型,以毫秒为单位,默认是300毫秒
android:startOffset 动画延迟的时间,从调用start()方法后开始计算,int类型,毫秒单位
android:repeatCount 动画执行重复次数,int类型,“-1”表示无限循环,“1”表示执行一次也就是总共执行两次,默认为0不重复
android:repeatMode 重复模式,当动画执行完的时候应该如何处理,该指必须是证书或者-1,“reverse”会使动画向相反方向执行,可实现类似钟摆的效果,“repeat”会使动画每次都从头开始循环
android:valueType 有intType、floatType两种,分别说明动画值是int和float类型,如果是颜色,就不需要指定了,系统会自动处理颜色值

objectAnimator的属性同上

在activity中调用

1
2
3
4
AnimatorSet set = AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.animtor.property_animator);
set.setTarget(myObject);
set.start();

纯代码方式去实现属性动画