Android平移动画属于视图动画的一种,通过xml配置可以灵活定义视图的位移轨迹、时长和重复规则,相比代码动态创建动画,xml配置的可维护性和复用性更强。开发者只需要按照固定的目录结构和属性规则编写配置,就能实现各种平移效果。

平移动画xml文件的存放路径
Android规定动画xml文件需要放在res/anim目录下,如果该目录不存在,需要在res目录下手动新建anim文件夹。所有的平移、缩放、旋转等视图动画的xml配置都需要放在这个目录中,否则在代码中引用时会找不到资源。
平移动画核心属性说明
平移动画对应的xml标签是<translate>,核心属性如下:
- android:fromXDelta:动画开始时视图在X轴的偏移量,可以是具体数值(单位dp)、百分比(相对于自身宽度,如50%表示自身宽度的一半)或者百分比p(相对于父容器宽度,如50%p表示父容器宽度的一半)
- android:toXDelta:动画结束时视图在X轴的偏移量,取值规则和fromXDelta一致
- android:fromYDelta:动画开始时视图在Y轴的偏移量,取值规则同X轴属性
- android:toYDelta:动画结束时视图在Y轴的偏移量,取值规则同X轴属性
- android:duration:动画持续时长,单位是毫秒,比如300表示300毫秒
- android:repeatCount:动画重复次数,-1表示无限重复,0表示不重复,1表示重复1次
- android:repeatMode:动画重复模式,restart表示从头开始,reverse表示反向执行
- android:fillAfter:动画结束后是否保持结束时的状态,true为保持,false为回到初始状态
平移动画xml配置完整示例
下面是一个从左侧滑入屏幕的平移动画配置,文件名为translate_in.xml,存放在res/anim目录下:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%p" <!-- 初始位置在父容器左侧一个父容器宽度的位置 -->
android:toXDelta="0" <!-- 结束位置在自身初始位置 -->
android:fromYDelta="0"
android:toYDelta="0"
android:duration="300" <!-- 动画持续300毫秒 -->
android:fillAfter="true" /> <!-- 动画结束后保持结束状态 -->
再提供一个上下往复平移动画的配置,文件名为translate_up_down.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="-50dp" <!-- 向上移动50dp -->
android:duration="500"
android:repeatCount="3" <!-- 重复3次 -->
android:repeatMode="reverse" <!-- 重复时反向执行 -->
android:fillAfter="false" />
在代码中调用平移动画
配置好xml文件后,需要在Activity或Fragment中加载并启动动画,示例代码如下:
// 加载平移动画配置 Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_in); // 获取需要执行动画的视图 TextView targetTv = findViewById(R.id.target_tv); // 启动动画 targetTv.startAnimation(translateAnimation);
如果需要监听动画的启动、结束等状态,可以给动画设置监听:
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// 动画开始时的逻辑
}
@Override
public void onAnimationEnd(Animation animation) {
// 动画结束时的逻辑
}
@Override
public void onAnimationRepeat(Animation animation) {
// 动画重复时的逻辑
}
});
常见问题说明
如果动画没有生效,可以先检查以下几点:首先确认xml文件是否放在res/anim目录下,其次检查偏移量的取值是否符合预期,比如使用百分比p时是否正确表示相对于父容器的偏移。另外,平移动画只是改变视图的绘制位置,不会改变视图的实际布局参数,如果需要改变布局位置,需要配合属性动画使用。