View 动画框架
使用 View 动画框架可以在 View 上执行补间动画。
补间动画是指,只要指定动画的开始与结束的“关键帧”,而动画变化的“中间帧”由系统计算并补齐。
动画并没有改变 View 的实际位置,仅是改变了 View 的显示位置。
FILE LOCATION:
res/anim/filename.xml
The filename will be used as the resource ID.
COMPILED RESOURCE DATATYPE:
Resource pointer to an Animation.
RESOURCE REFERENCE:
In Java: R.anim.filename
In XML: @[package:]anim/filename
文件位置:
res /anim/ filename.xml
文件名将用作资源ID。
编制资源数据类型:
指向动画的资源指针。
资源引用:
在Java: R.anim.filename
在XML: @包:anim/文件名
// XML使用
// res /anim/ anim_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_file"
android:animationOrder="normal"
android:delay="0.5">
<!--android:delay="0.5" 子View动画显示的延迟时间比例-->
<!--比如动画执行时间是300ms,延迟比例是0.5,那么延迟时间就是150ms-->
<!--android:animationOrder="normal" 表示动画执行的顺序类型,共有三种-->
<!--normal表示子View按顺序显示,reverse表示子View按逆序显示,random表示子View随机先后显示。-->
</layoutAnimation>
// res /layout/ activity_main.xml
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/anim_layout"
android:divider="#f1f1f1"
android:dividerHeight="1dp">
</ListView>
语法:
<?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"] >
<!--<set>标签表示补间动画的集合,对应于AnimationSet类。-->
<!--android:interpolator-->
<!--Interpolator resource. 设置动画集合所采用的插值器,默认值为@android:anim/accelerate_decelerate_interpolator-->
<!--android:shareInterpolator-->
<!--Boolean. 表示集合中的动画是否共享集合的插值器。当值为true且集合没有设置插值器,-->
<!--此时集合中的动画就会使用默认的插值器@android:anim/accelerate_decelerate_interpolator,-->
<!--但也可以为集合中的动画单独指定所需的插值器。-->
<--透明度动画-->
<alpha
android:fromAlpha="float" // 透明度初始值。其中,0.0是完全透明,1.0是完全不透明。
android:toAlpha="float" // 透明度结束值。其中,0.0是完全透明,1.0是完全不透明。
/>
<--缩放动画-->
<scale
android:fromXScale="float" // 水平方向缩放比例的初始值,其中1.0是没有任何变化。
android:toXScale="float" // 水平方向缩放比例的结束值,其中1.0是没有任何变化。
android:fromYScale="float" // 竖直方向缩放比例的初始值,其中1.0是没有任何变化。
android:toYScale="float" // 竖直方向缩放比例的结束值,其中1.0是没有任何变化。
android:pivotX="float" // 缩放中心点的x坐标
android:pivotY="float" // 缩放中心点的y坐标
/>
<--平移动画-->
<translate
android:fromXDelta="float or percentage"
// 移动起始点的x坐标,表现形式有三种;
// 1.相对于自己的左边界的距离,单位像素值。(例如 "5")
// 2.相对于自己的左边界的距离与自身宽度的百分比。(例如 "5%")
// 3.相对于父View的左边界的距离与父View宽度的百分比。(例如 "5%p")
android:toXDelta="float or percentage"
// 移动结束点的x坐标,表现形式同上;
android:fromYDelta="float or percentage"
// 移动起始点的y坐标,表现形式有三种;
// 1.相对于自己的上边界的距离,单位像素值。(例如 "5")
// 2.相对于自己的上边界的距离与自身高度的百分比。(例如 "5%")
// 3.相对于父View的上边界的距离与父View高度的百分比。(例如 "5%p")
android:toYDelta="float or percentage"
// 移动结束点的y坐标,表现形式同上;
/>
<--旋转动画-->
<rotate
android:fromDegrees="float" // 旋转初始的角度
android:toDegrees="float" // 旋转结束的角度
android:pivotX="float or percentage"
// 旋转中心点x坐标,表示形式有三种:
// 1.相对于自己的左边界的距离,单位像素值。(例如 "5")
// 2.相对于自己的左边界的距离与自身宽度的百分比。(例如 "5%")
// 3.相对于父View的左边界的距离与父View宽度的百分比。(例如 "5%p")
android:pivotY="float or percentage"
// 旋转中心点y坐标,表示形式有三种:
// 1.相对于自己的上边界的距离,单位像素值。(例如 "5")
// 2.相对于自己的上边界的距离与自身宽度的百分比。(例如 "5%")
// 3.相对于父View的上边界的距离与父View高度的百分比。(例如 "5%p")
/>
<set>
...
</set>
</set>
四种动画示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Animation animation;
private TextView tvAlpha,tvScale,tvTranslate,tvRotate;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
// animation = AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
// 因为有动画链的原因,假定有一个移动的动画紧跟一个淡出的动画,
// 如果不把移动的动画的setFillAfter置为true,那么移动动画结束后,View会回到原来的位置淡出,
// 就像重置了一样,动画执行完,回到初始样式。
// 如果setFillAfter置为true, 就会在移动动画结束的位置淡出
// 也就是动画执行完,会保持动画执行后的样式。
// animation.setFillAfter(true);
// iv.startAnimation(animation);
}
private void initView() {
iv=findViewById(R.id.iv_main_anim);
tvAlpha=findViewById(R.id.tv_main_alpha);
tvScale=findViewById(R.id.tv_main_scale);
tvTranslate=findViewById(R.id.tv_main_translate);
tvRotate=findViewById(R.id.tv_main_rotate);
tvAlpha.setOnClickListener(this);
tvScale.setOnClickListener(this);
tvTranslate.