Android-动画xml

动画分为两种:

  • 属性动画-通过一段时间修改对象的属性值来创建的动画
  • 视图动画-分为补间动画、帧动画

属性动画

以xml定义的动画,用于在设定的时间类修改目标对象的属性,例如背景色

文件存放位置:res/animator/filename.xml
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
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>

<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>

关键字

  • <set>代表一个AnimatorSet
    • android:ordering
描述
sequentially 顺序播放
together(默认) 同时播放
  • <objectAnimator> 代表一个ObjectAnimator
    • android:propertyName 对象的动画属性,View中的属性,例如:alphabackgroundColor
    • android:valueTo 动画属性结束的值
    • android:valueFrom 动画属性开始的值
    • android:duration 动画的持续时间
    • android:startOffset 调用动画延迟后的毫秒数
    • android:repeatCount重复动画的次数,-1为无限循环,1为重复一次
    • android:repeatMode动画结束时的行为方式,reverse表示反向,repeat为从头开始,当且仅当repeatCount-1时有效
    • android:valueType指定动画值
描述
intType 指定动画值是整数
floatType (默认) 指定动画值为浮点数
  • <animator> 代表一个ValueAnimator,属性与<objectAnimator>类似,少了android:propertyName

使用

1
2
3
4
5
val set: AnimatorSet = AnimatorInflater.loadAnimator(this, R.animator.animator)
.apply {
setTarget(myTarger)
start()
}

视图动画

视图动画框架支持补间动画和逐帧动画

补间动画

文件存放位置:res/anim/filename.xml
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
28
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>

关键字

  • <set>代表一个AnimatorSet

    • android:interpolator 插值资源,例如:@android:anim/accelerate_interpolator
    • android:shareInterpolator 插值器是否应用所有子元素
  • <alpha> 淡入淡出动画,代表一个AlphaAnimation

    • android:fromAlpha开始的不透明值
    • android:toAlpha 结束的不透明值
  • <scale> 调整大小的动画,代表一个ScaleAnimation,其中pivotX,pivotY的值为0,0时代表左上角,所有增长代表向右和向下
    • android:fromXScale 开始x的大小偏移
    • android:toXScale结束x的大小偏移
    • android:fromYScale开始y的大小偏移
    • android:toYScale结束y的大小偏移
    • android:pivotX 缩放对象时,x坐标保持固定,百分比
    • android:pivotY 缩放对象时,y坐标保持固定,百分比
  • <translate>垂直和/或水平运动的动画,代表一个TranslateAnimation
    • android:fromXDelta开始X偏移,浮点5表正常像素值,百分比表当前元素的宽高百分比
    • android:toXDelta结束X偏移
    • android:fromYDelta开始Y偏移
    • android:toYDelta结束Y偏移
  • <rotate> 旋转动画,代表一个RotateAnimation
    • android:fromDegrees起始角度
    • android:toDegrees结束角度
    • android:pivotX旋转中心X坐标
    • android:pivotY旋转中心Y坐标

使用

1
2
3
4
fun animatorStart(view: View){
val animation = AnimationUtils.loadAnimation(this,R.anim.animation)
view.startAnimation(animation)
}

帧动画

按顺序显示一系列图像(如电影),代表一个AnimationDrawable
文件存放目录:res/drawable/filename.xml
xml格式如下:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>

关键字

  • <animation-list>必须为根元素,包含一个或多个<item>元素
    • android:oneshot是否执行一次,如果false,会循环播放
  • <item> 单帧动画
    • android:drawable可绘制的资源
    • android:duration持续时间

使用

res/drawable/idea_drawable.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

1
2
3
4
5
tv.setBackgroundResource(R.drawable.idea_drawable)
val rocketImage=tv.background
if(rocketImage is Animatable){
rocketImage.start()
}

插值器

插值器影响动画中的变化速率,允许现有的动画效果加速,减速,重复,反弹等,使用android:interpolator属性引用插值器

文件存放位置:res/anim/filename.xml

关键字

  • <accelerateDecelerateInterpolator>变化率开始和结束缓慢,中间加速
  • <accelerateInterpolator>变化速率开始缓慢,然后加速
    • android:factor变化速率,默认为1
  • <anticipateInterpolator>变化开始然后向前飞
    • android:tension要应用的张力量,默认为2
    • android:extraTension增加张力的量,默认为1.5
  • <anticipateOvershootInterpolator>变化向后开始,向前掠过并超过目标值,然后稳定再最终值
  • <bounceInterpolator>变化后反弹
  • <cycleInterpolator>重复动画指定的循环次数
    • android:cycles 循环次数,默认为1
  • <decelerateInterpolator> 变化很快开始,然后减速
    • android:factor 减速率,默认为1
  • <linearInterpolator>变化率不变
  • <overshootInterpolator>变化向前掠过并超出最大值后返回
    • android:tension要应用的张力量,默认为2

      使用

      my_overshoot_interpolator.xml
      1
      2
      3
      4
      <?xml version="1.0" encoding="utf-8"?>
      <overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
      android:tension="7.0"
      />
1
2
3
4
5
6
7
8
9
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />

评论系统未开启,无法评论!