Android 动画资源
概述
在Android开发的过程中,View的变化是很常见的,如果View变化的过程没有动画来过渡而是瞬间完成,会让用户感觉很不友好,因此学习好Android系统中的动画框架是很重要的。
Android系统提供了两个动画框架:属性动画框架和View动画框架。 两个动画框架都是可行的选项,但是属性动画框架通常是首选的使用方法,因为它更灵活,并提供更多的功能。 除了这两个框架,还可以使用Drawable动画(即逐帧动画,AnimationDrawable),它允许你加载Drawable资源并逐帧地显示它们。
View动画框架
View动画框架是旧的框架,只能用于Views。 比较容易设置和能满足许多应用程序的需要。View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画;并且View动画框架还提供了动画集合类(AnimationSet),通过动画集合类(AnimationSet)可以将多个补间动画以组合的形式显示出来。View动画框架中动画相关类的继承关系如下图所示:
属性动画框架
与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画。因此Google在Android3.0(API级别11)及其后续版本中添加了属性动画框架,从名称中就可以知道只要某个类具有属性(即该类含有某个字段的set和get方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的get,set方法),同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。属性动画框架中动画相关类的继承关系如下图所示:
Drawable 动画
可绘制动画通过一个接一个地加载一系列Drawable资源来创建动画。 这是一个传统的动画,它是用一系列不同的图像创建的,按顺序播放,就像一卷电影;逐帧动画中动画相关类的继承关系如下图所示:
View动画框架
使用View动画框架可以在Views上执行补间动画。 补间动画是指只要指定动画的开始、动画结束的"关键帧",而动画变化的"中间帧"由系统计算并补齐;无论动画怎样改变View的显示区域(移动或者改变大小),持有该动画的View的边界不会自动调整来适应View的显示区域, 即使如此,该动画仍将被绘制在超出其视图边界并且不会被剪裁, 但是,如果动画超过父视图的边界,则会出现裁剪。在Android中的View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画。
文件位置 | 编译数据类型 | 资源的引用 |
---|---|---|
res/anim/filename.xml | Animation | Java: R.anim.filename XML: @[package:]anim/filename |
文件名将作为资源的ID 也就是R.id.filename
开启动画步骤
- 创建动画文件
- 创建需要动画的View
- 使用AnimationUtils 加载动画
- view播放动画
语法:
<?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>
容纳其他动画元素的容器 (<alpha>, <scale>, <translate>, <rotate>) 或其他<set> 元素. 表示一个AnimationSet
属性:
android:interpolator
插值器资源。 用于动画的插值器。 该值必须是插值器的资源的引用。 平台提供默认插值器几种资源,也可以创建自己的插值器资源。
android:shareInterpolator
Boolean值:如果要在所有子元素中共享相同的插值器,则为“true”。
<alpha>
透明度动画,其编译类型: AlphaAnimation.
属性:
android:fromAlpha
float: 开始透明度,0.0是透明的,1.0是不透明的。
android:toAlpha
Float.结束透明度,0.0是透明的,1.0是不透明的。
<scale>
缩放动画。 您可以通过指定pivotX和pivotY指定图像的中心点,使其向外(或向内)缩放。 例如,如果这些值为0,0(左上角),则所有缩放都将向下和向右。 编译类型:ScaleAnimation。
属性:
android:fromXScale
android:toXScale
android:fromYScale
Float.开始缩放:1.0表示不缩放,大于1表示放大。小于则缩小
android:toYScale
Float.结束缩放:1.0表示不缩放,大于1表示放大。小于则缩小
android:pivotX
android:pivotY
Float. 缩放中心点
<translate>
平移动画。 支持三种值:从-100到100以“%”结尾的值,表示相对于自身的百分比; 以“%p”结尾的-100到100之间的值,表示相对于其父级的百分比; 没有后缀的浮点值,表示绝对值。 编译类型:TranslateAnimation。
属性:
android:fromXDelta
android:toXDelta
android:fromYDelta
Float或百分比。 开始位置。 数值说明:相对于正常位置的像素(“5”),相对于元素宽度的百分比(“5%”),或相对于父宽度的百分比(“5%p”))。
android:toYDelta
Float或百分比。 结束位置。 数值说明:相对于正常位置的像素(“5”),相对于元素宽度的百分比(“5%”),或相对于父宽度的百分比(“5%p”))。
<rotate>
旋转动画,编译类型为:RotateAnimation.
属性:
android:fromDegrees
开始旋转角度:Float值
android:toDegrees
结束旋转角度:Float值
android:pivotX
android:pivotY
Float或百分比。 旋转中心坐标。 表示:相对于对象左边缘的像素(例如“5”),相对于对象左边缘的百分比(例如“5%”),或相对于父容器左边缘的百分比(例如“5%p“)。
以上标签继承与Animation。所以继承Animation的xml属性
属性 | 说明 |
---|---|
android:detachWallpaper | 窗口动画的特殊选项:如果此窗口位于壁纸顶部,请不要使用它为壁纸设置动画。 |
android:duration | 动画运行的时间量(以毫秒为单位)。 |
android:fillAfter | 设置为true时,将在动画结束后应用动画转换(保持最终状态)。 |
android:fillBefore | 设置为true或fillEnabled未设置为true时,将在动画开始之前应用动画转换(最终位置)。 |
android:fillEnabled | 设置为true时,将考虑fillBefore的值。 |
android:interpolator | 定义用于平滑动画移动的插值器。 |
android:repeatCount | 定义动画应重复的次数。 |
android:repeatMode | 定义到达结尾时的动画行为,并且重复计数大于0或无限。 |
android:startOffset | 延迟运行,单位为毫秒 |
android:zAdjustment | 允许在动画持续时间内调整动画内容的Z排序。 |
View动画综合练习
动画执行顺序:平移->旋转->缩放->透明
动画执行效果:
动画文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="2000"
android:fromXDelta="-100"
android:fromYDelta="-100"
android:toXDelta="100"
android:toYDelta="100" />
<rotate
android:duration="2000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="2000"
android:toDegrees="+360" />
<scale
android:duration="3000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="4000"
android:toXScale="0.5"
android:toYScale="0.5" />
<alpha
android:duration="4000"
android:fromAlpha="1.0"
android:startOffset="6000"
android:toAlpha="0.0" />
</set>
开始动画
View view = findViewById(R.id.anim);
Animation loadAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim);
view.startAnimation(loadAnimation);
ListView条目入场动画:
LayoutAnimationController lac = new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.anim));
lac.setDelay(0.5f);
lac.setOrder(LayoutAnimationController.ORDER_RANDOM);
mListView.setLayoutAnimation(lac);
mListView.startLayoutAnimation();//开始播放动画
上面通过代码设置,也可以通过xml指定
<ListView
android:id="@+id/listView"
android:layoutAnimation="@anim/anim_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
res/anim/anim_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="random"
android:animation="@anim/zoom_in"/>
逐帧动画 Frame animation
以XML格式定义的动画,按顺序显示一系列图像(如胶卷电影)。
文件位置 | 编译类型 | 引用方式 |
---|---|---|
res/drawable/filename.xml | AnimationDrawable | Java: R.drawable.filename XML: @[package:]drawable.filename |
文件名将作为资源ID
语法
<?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
Boolean. "true" 执行一次,false循环
<item>
单帧动画。 必须是<animation-list>元素的子元素。
属性:
android:drawable
Drawable 资源,这帧动画将显示这个drawable资源
android:duration
Integer. 显示此帧的持续时间,以毫秒为单位。
例子
<?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>
# java代码中调用
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = rocketImage.getBackground();
if (rocketAnimation instanceof Animatable) {
((Animatable)rocketAnimation).start();
}
上面通过xml声明逐帧动画,也可以通过java代码实现:
//代码定义、创建、执行动画
AnimationDrawable animationDrawable = new AnimationDrawable();
animationDrawable.addFrame(getResources().getDrawable(R.drawable.first_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.second_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.third_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.fourth_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.fifth_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.sixth_pic), 1000);
animationDrawable.setOneShot(true);
image.setImageDrawable(animationDrawable);
animationDrawable.start();
注意:对于一些手机,在Activity的onCreate()方法中调用AnimationDrawable的start()方法不起效果,可能是由于播放动画的ImageView还没有准备好,此时就需要在onCreate之后的生命周期的方法中调用,比如onResume方法。
属性动画框架
与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画,因此Google在Android3.0及其后续版本中添加了属性动画框架。同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。
下面是我关于属性动画框架工作原理的总结:
顾名思义只要某个类具有属性(即该类含有某个字段的set和get方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的get,set方法),因此属性动画框架可以实现View动画框架的所有动画效果并且还能实现View动画框架无法实现的动画效果。属性动画框架工作原理可以总结为如下三步:
-
在创建属性动画时如果没有设置属性的初始值,此时Android系统就会通过该属性的get方法获取初始值,所以在没有设置属性的初始值时,必须提供该属性的get方法,否者程序会Crash。
-
在动画播放的过程中,属性动画框架会利用时间流逝的百分比获取属性值改变的百分比(即通过时间插值器),接着利用获取的属性值改变的百分比获取改变后的属性值(即通过类型估值器)。
-
通过该属性的set方法将改变后的属性值设置到对象中。
还要注意一点,虽然通过set方法改变了对象的属性值,但是还要将这种改变用动画的形式表现出来,否者就不会有动画效果,所以属性动画框架本身只是不断的改变对象的属性值并没有实现动画效果。
文件位置 | 编译类型 | 资源引入 |
---|---|---|
res/animator/filename.xml | ValueAnimator ObjectAnimator AnimatorSet. | Java: R.animator.filename XML: @[package:]animator/filename |
文件名称将作为资源名称
语法
<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>,<objectAnimator>或<valueAnimator>。 您可以在<set>元素内将动画元素组合在一起,包括其他<set>元素。
属性说明
标签 | 编译类型 | 说明 |
---|---|---|
<objectAnimator> | ObjectAnimator | 在特定时间内动画对象的特定属性 |
<animator> | ValueAnimator | 在指定的时间内执行动画 |
<set> | AnimatorSet | 可以包含objectAnimator、ValueAnimator、AnimatorSet的集合类 |
- android:ordering
Keyword.指定此集中动画的播放顺序。
Value | Description |
---|---|
sequentially | 按顺序播放此集中的动画 |
together (默认) | 同时在此集中播放动画。 |
- android:valueType
Keyword.如果值是颜色,请不要指定此属性。 动画框架自动处理颜色值
值 | 描述 |
---|---|
intType | 指定动画值是整数 |
floatType (default) | 指定动画值为浮点数 |
属性
标签 | 类型 | 说明 |
---|---|---|
android:propertyName | String | 动画类型,由其名称引用。 例如,您可以为View对象指定“alpha”或“backgroundColor”。 但是,objectAnimator元素不公开目标属性,因此您无法在XML声明中将对象设置为动画。 您必须通过调用loadAnimator()并调用setTarget()来设置包含此属性的目标对象来使用。 |
android:valueTo | float, int或color | 需要。 动画属性结束的值。 颜色表示为六位十六进制数字(例如,#333333)。 |
android:valueFrom | float, int, or color | 动画属性开始的值。 如果未指定,则动画从属性的get方法获取的值开始。 颜色表示为六位十六进制数字(例如,#333333)。 |
android:duration | int | 动画的时间(以毫秒为单位)。 默认值为300毫秒。 |
android:startOffset | int | 调用start()后动画延迟的毫秒数。 |
android:repeatCount | int | 重复动画多少次。 设置为“-1”以无限重复或为正整数。 例如,值“1”表示动画在初始运行动画后重复一次,因此动画总共播放两次。 默认值为“0”,表示不重复。 |
android:repeatMode | int | 动画到达动画结尾时的行为方式。 - android:repeatCount必须设置为正整数或“-1”才能使此属性生效。 设置为“反向”以使动画在每次迭代时反向或“重复”以使动画循环从每次开始。 |
属性动画例子:
View view = findViewById(R.id.animView);
//利用ObjectAnimator实现透明度动画
ObjectAnimator.ofFloat(view, "alpha", 1, 0, 1)
.setDuration(5000).start();
//利用AnimatorSet和ObjectAnimator实现平移动画
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(view, "translationX", 20, 100).setDuration(2000),
ObjectAnimator.ofFloat(view, "translationY", 20, 100).setDuration(2000));
animatorSet.start();
//利用ObjectAnimator实现旋转动画
view.setPivotX(view.getWidth() / 2.0f);
view.setPivotY(view.getHeight() / 2.0f);
ObjectAnimator.ofFloat(view, "rotation", 0, 360)
.setDuration(1000).start();
//利用AnimatorSet和ObjectAnimator实现缩放动画
AnimatorSet animatorSet = new AnimatorSet();
view.setPivotX(view.getWidth() / 2.0f);
view.setPivotY(view.getHeight() / 2.0f);
animatorSet.playTogether(
ObjectAnimator.ofFloat(view, "scaleX", 1, 0).setDuration(5000),
ObjectAnimator.ofFloat(view, "scaleY", 1, 0).setDuration(5000));
animatorSet.start();
通过ValueAnimator实现属性动画
其实ValueAnimator类就是一个数值生成器,也就是没有上面关于属性动画框架工作原理的第1步和第3步,ObjectAnimator作为ValueAnimator的子类,实现了这两步。你只要给ValueAnimator提供一个初始值、结束值和周期时间,ValueAnimator就会按照属性动画框架工作原理的第2步中的步骤生成具有一定规则的数字。
案例
View view = findViewById(R.id.animView);
ValueAnimator valueAnimator = createDropAnimator(view, 0, mHiddenViewHeight);
valueAnimator.setInterpolator(new AccelerateInterpolator());
valueAnimator.setDuration(1000).start();
private ValueAnimator createDropAnimator(final View view, int start, int end) {
ValueAnimator valueAnimator = ValueAnimator.ofInt(start, end);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = (int) animation.getAnimatedValue();
view.setLayoutParams(params);
}
});
return valueAnimator;
}
属性动画常用的特殊场景
属性动画可以为ViewGroup的子View的显示和隐藏设置过渡动画。Android系统中已经提供了默认过渡动画(在layout文件中将ViewGroup的animateLayoutChanges属性打开就可以使用系统提供的默认过渡动画)。Android系统中一共提供了如下所示的4种类型的过渡动画:
类型 | 说明 |
---|---|
APPEARING | 当子View的可见性为VISIBLE或者通过addView方法添加子View 来显示子View时,子View就会执行该类型的动画。该类型动画的周期为300毫秒,默认延迟为300毫秒。 |
DISAPPEARING | 当设置子View的可见性为GONE或者通过removeView方法移除子View 来隐藏子View时,子View就会执行该类型的动画。该类型动画的周期为300毫秒,默认延迟为0毫秒。 |
CHANGE_APPEARING | 当显示子View时,所有的兄弟View就会立即依次执行该类型动画并且兄弟View之间执行动画的间隙默认为0毫秒,然后才会执行显示子View的动画。该类型动画的周期为300毫秒,默认延迟为0毫秒。 |
CHANGE_DISAPPEARING | 当隐藏子View的动画执行完毕后,所有的兄弟View就会依次执行该类型动画并且兄弟View之间执行动画的间隙默认为0毫秒。该类型动画的周期为300毫秒,默认延迟为300毫秒。 |
布局添加删除执行动画案例
mLinearLayout = findViewById(R.id.layout);
LayoutTransition transition = new LayoutTransition();
transition.setStagger(LayoutTransition.CHANGE_APPEARING, 30);
transition.setDuration(LayoutTransition.CHANGE_APPEARING, transition.getDuration(LayoutTransition.CHANGE_APPEARING));
transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, 0);
ObjectAnimator appearingAnimator = ObjectAnimator
.ofPropertyValuesHolder(mLinearLayout,
PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
PropertyValuesHolder.ofFloat("alpha", 0, 1.0f));
transition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
transition.setDuration(LayoutTransition.APPEARING, transition.getDuration(LayoutTransition.APPEARING));
transition.setStartDelay(LayoutTransition.APPEARING, transition.getDuration(LayoutTransition.CHANGE_APPEARING));
ObjectAnimator disappearingAnimator = ObjectAnimator
.ofPropertyValuesHolder(
mLinearLayout,
PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("alpha", 1.0f, 0));
transition.setAnimator(LayoutTransition.DISAPPEARING, disappearingAnimator);
transition.setDuration(LayoutTransition.DISAPPEARING, transition.getDuration(LayoutTransition.DISAPPEARING));
transition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
transition.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 30);
transition.setDuration(LayoutTransition.CHANGE_DISAPPEARING, transition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, transition.getDuration(LayoutTransition.DISAPPEARING));
mLinearLayout.setLayoutTransition(transition);
上面代码依次对CHANGE_APPEARING、APPEARING、DISAPPEARING和CHANGE_DISAPPEARING类型的过渡动画进行了设置,下面就来分析常用的设置方法:
方法 | 说明 |
---|---|
setStagger | 当多个子View要执行同一个类型的动画时,就可以通过该方法来设置子View之间执行动画的间隙,默认为0毫秒。 |
setAnimator | 为指定类型的过渡动画设置自定义的属性动画。 |
setDuration | 为指定类型的过渡动画设置执行动画的周期,默认为300毫秒。 |
setStartDelay | 为指定类型的过渡动画设置延迟执行的时间,默认与过渡动画的类型相关,上面已经说过。 |
setLayoutTransition | 为ViewGroup设置过渡动画。 |
无法使用属性动画或者属性动画不起作用的情况和解决方法
无法使用属性动画或者属性动画不起作用的情况如下:
1 该字段没有set和get方法
2 该属性的set方法仅仅改变了对象的属性值,但是没有将这种改变用动画的形式表现出来
解决方法如下:
1 如果你有权限的话,给这个字段添加get和set方法,比如在自定义View中。
2 使用一个包装类来封装该字段对应的类,间接为该字段提供get和set方法。
例如使ImageView从当前高度变化到600,代码如下所示:
ViewWrapper viewWrapper = new ViewWrapper(mImageView);
ObjectAnimator.ofInt(viewWrapper, "height", 600).setDuration(5000).start();
public class ViewWrapper {
private View view;
public ViewWrapper(View view) {
this.view = view;
}
public int getHeight(){
return view.getLayoutParams().height;
}
public void setHeight(int height){
view.getLayoutParams().height = height;
view.requestLayout();
}
}
插值器
插值器是以XML定义的动画修饰符,它影响动画中的变化率。 可以实现动画效果加速,减速,重复,反弹等。
插值器应用于具有android:interpolator属性的动画元素,其值是对插值器资源的引用。
Android中的所有插值器都是Interpolator类的子类。 对于每个插值器类,Android提供了几种常用的插值器,以便使用android:interpolator属性将插值器应用于动画。 下面列出常用的插值器:
插值器 | 引用ID |
---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator |
AccelerateInterpolator | @android:anim/accelerate_interpolator |
AnticipateInterpolator | @android:anim/anticipate_interpolator |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator |
BounceInterpolator | @android:anim/bounce_interpolator |
CycleInterpolator | @android:anim/cycle_interpolator |
DecelerateInterpolator | @android:anim/decelerate_interpolator |
LinearInterpolator | @android:anim/linear_interpolator |
OvershootInterpolator | @android:anim/overshoot_interpolator |
使用插值器:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
自定义插值器
如果对平台提供的插补器(在上表中列出)不满意,则可以创建具有已修改属性的自定义插补器资源。 例如,可以调整AnticipateInterpolator的加速率,或调整CycleInterpolator的周期数。 为此,您需要在XML文件中创建自己的插补器资源。
文件位置 | 编译类型 | 引用方式 |
---|---|---|
res/anim/filename.xml | interpolator | xml:@[package:]anim/filename |
文件名将作为资源ID
语法
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"/>
元素说明
请注意,每个Interpolator实现在以XML格式定义时,都以小写字母开头。
<accelerateDecelerateInterpolator>
变化率开始和结束缓慢但在中间加速。
<accelerateInterpolator>
变化率开始缓慢,然后加速。
属性:
android:factor
Float. 加速率(默认为1)。
<anticipateInterpolator>
变化开始向后然后向前。
属性:
android:tension
Float。 要应用的张力量(默认值为2)。
<anticipateOvershootInterpolator>
先慢后快,并超过目标量,然后稳定在最终值。
属性:
android:tension
Float. 要应用的张力量(默认值为2)。
android:extraTension
Float.增加张力的量(默认值为1.5)。
<bounceInterpolator>
这一变化在最后反弹。
<cycleInterpolator>
重复动画指定的循环次数。 变化率遵循正弦曲线模式。
属性:
android:cycles
Integer. 循环次数(默认为1)。
<decelerateInterpolator>
变化率开始很快,然后减速。
属性:
android:factor
Float.减速率(默认为1)。
<linearInterpolator>
变化率是不变的。
<overshootInterpolator>
变化向前掠过并超过最后一个值,然后回来。
属性:
android:tension
Float.要应用的张力量(默认值为2)。
示例:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"/>
# 在动画元素中应用
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator" />