Android补间动画

本文详细介绍了Android中的补间动画和帧动画。补间动画包括XML和Java代码形式,涉及平移、缩放、旋转和透明度四种效果,但存在作用对象局限性和动画效果单一等问题。帧动画则是按照顺序播放一组图片,通过animation-list和item标签在XML中定义,或者使用AnimationDrawable在Java代码中实现。
摘要由CSDN通过智能技术生成

概述

本篇博客基于《Android开发艺术探索》,将会介绍以下两种动画:

  • 补间动画
  • 帧动画

事实上帧动画也是补间动画的一种,但是它们的使用方式略有不同,所以将它们分开介绍。


一、补间动画

补间动画(Tween animation)也叫做View动画,因为它的作用对象是View,它支持平移、缩放、旋转和透明度四种变换效果,它们的具体描述如下表所示:

名称 标签 子类 效果
平移动画 <translate> TranslateAnimation 移动View
缩放动画 <scale> ScaleAnimation 放大或缩小View
旋转动画 <rotate> RotateAnimation 旋转View
透明度动画 <alpha> AlphaAnimation 改变View透明度

补间动画的创建有两种形式:XML文件和代码形式,下面分别介绍它们。

1. XML文件形式

XML文件形式即通过在XML文件中设置相关属性来达到动画的效果,需要特别注意的是动画相关的XML文件必须放置在 res/anmi/ 文件夹中,如下图所示:
在这里插入图片描述

1.1 set标签

刚创建的文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

</set>

可以看到有一个 <set> 标签,表示的是动画集合,它可以包含若干个动画,并且其内部也是可以嵌套其他动画集合的。它有两个可指定的属性值如下:

属性 描述
interpolator 表示动画集合所采用的插值器,默认为加减速插值器
shareInterpolator 表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或使用默认值

例子:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:shareInterpolator="false">
	......
</set>

在这个例子中 intercepolator 设置为 @android:anim/accelerate_decelerate_interpolator,即默认值,如果不设置该属性达到的效果也是一样的。将 shareInterpolator 属性设置为 false 表示集合中的动画不和集合共享同一插值器。

1.2 translate标签

<translate>标签用于控制平移动画,它可以使一个View在水平/竖直方向上完成平移的动画效果,它的一系列属性含义如下表所示:

属性 描述
fromXDelta 表示 x 的起始值
toXDelta 表示 x 的结束值
fromYDelta 表示 y 的起始值
toYDelta 表示 y 的结束值

其中,各个属性有如下三种取值类型可供选择:

类型 描述
float 当取值为浮点类型的数值时,表示为绝对值类型,默认以px为单位
% 相对自身的百分比取值,表示以当前View的宽度或高度为基数计算
%p 相对父布局的百分比取值,表示以父视图的宽度或高度为基数计算

平移动画的起始点为View的左上角位置,如下图所示:

在这里插入图片描述

例子:

<translate
    android:duration="100"
    android:fromXDelta="0.5"
    android:toXDelta="100.5"
    android:fromYDelta="0.5"
    android:toYDelta="100.5" />

该例子表示View从 (0.5, 0.5) 的位置平移到 (100.5, 100.5) 的位置,动画时间为100ms。

1.3 scale标签

<scale>标签表示缩放动画,它可以使View具有放大/缩小的效果,它的一系列属性含义如下表所示:

属性 描述
fromXScale 水平方向缩放的起始值
toXScale 水平方向缩放的结束值
fromYScale 竖直方向缩放的起始值
toYScale 竖直方向缩放的结束值
pivotX 缩放的轴点的 x 坐标
pivotY 缩放的轴点的 y 坐标

例子:

<scale
    android:duration="500"
    android:fromXScale="0.5"
    android:toXScale="1.5"
    android:fromYScale="0.5"
    android:toYScale="1.5"/>

这个例子是将View从原来的0.5倍放大到原来的1.5倍,动画时间是500ms。缩放轴点为View左上角(默认情况下),如果想以View中心为轴点,可以做如下设置:

<scale
    android:duration="500"
    android:fromXScale="0.5"
    android:toXScale="1.5"
    android:fromYScale="0.5"
    android:toYScale="1.5"
    android:pivotX="50%"
    android:pivotY="50%"/>

其中轴点的取值方式也有三种类型可供选择:浮点型数字、相对自身的百分号%和相对父布局的百分比%p,这三种类型的含义在 translate 部分已经说过,这里不再赘述。

1.4 rotate标签

<rotate>标签表示旋转动画,它可以使View具有旋转的效果,它的一系列属性含义如下表所示:

属性 描述
fromDegrees 旋转开始的角度
toDegrees 旋转结束的角度
pivotX 旋转的轴点的 x 坐标
pivotY 旋转的轴点的 y 坐标
<rotate
    android:duration="400"
    android:fromDegrees="0.0"
    android:toDegrees="90.0"/>

该例子表示View从0°旋转90°,轴点为View的左上角(默认情况下)。如果想以View中心为轴点的话,可以按如下进行属性设置:

<rotate
    android:duration="400"
    android:fromDegrees="0.0"
    android:toDegrees="90.0"
    android:pivotX="50%"
    android:pivotY="50%"/>

这和缩放动画中轴点的相关设置是一致的,同样可以有三种取值方式:浮点型数值、相对自身的百分比以及相对父布局的百分比,这里不再赘述。

1.5 alpha标签

<alpha>标签表示透明度动画,它可以改变View的透明度,它的一系列属性含义如下表所示:

属性 描述
fromAlpha 表示透明度的起始值
toAlpha 表示透明度的结束值

alpha属性的取值为0.0~1.0。其中0.0表示完全透明,1.0表示完全不透明。

例子:

<alpha
    android:duration="500"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"/>

这个例子表示将View的透明度从完全透明变为完全不透明,动画时间为500ms。

1.6 共有属性

上面所说的为各自标签所特有的属性,它们之间也存在一些共有的属性,如下表所示:

属性 描述
duration 动画的持续时间,单位为ms
fillAfter 动画结束后View是否停留在结束位置,true表示停留在结束位置
startOffset 动画执行延迟的时间,单位为ms
interpolator 用于控制动画在不同时段的执行速度,默认是加减速插值器
repeatCount 动画的重复次数,默认为0,即不重复
repeatMode 有两个取值:restart和reverse,reverse表示动画正反轮流执行,restart表示一直从头开始执行
zAdjustment 在执行动画过程中调整Z轴的位置,有三个取值可选:normal、top和bottom,默认为normal

前面的XML文件设置完成之后,我们在Java中如何将它们引入相关的View播放动画呢?这就要借助 AnimationUtils#loadAnimation 方法来添加了,例如我们现在要为一个 ImageView 添加动画,代码如下所示:

Animation anim = AnimationUtils.loadAnimation(MainActivity.this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值