在Android应用开发中,加载中动画是提升用户交互体验的重要元素,Spinner样式的旋转加载动画因为简洁直观被广泛使用。通过XML的layer-list和rotate标签组合,不需要编写复杂的逻辑代码,就可以快速实现这类动画效果。

layer-list与rotate的基础概念
layer-list的作用
layer-list是Android XML drawable中的一种,它的作用是把多个drawable按层级叠加在一起,类似图层的概念。每一个<item>标签代表一个图层,后定义的图层会显示在先定义的图层上方,我们可以通过这个特性组合出复杂的图形效果。
rotate标签的作用
rotate是Android中的动画标签,用于定义旋转动画效果,它可以指定旋转的中心点、旋转角度、旋转时长等属性,既可以作用在单个drawable上,也可以和layer-list结合实现整体旋转效果。
实现加载中Spinner动画的步骤
第一步:创建基础图形图层
我们首先用layer-list定义Spinner的基础图形,这里用多个半圆弧叠加模拟常见的Spinner样式,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 底层灰色圆环 -->
<item>
<shape android:shape="ring"
android:innerRadiusRatio="3"
android:thicknessRatio="8"
android:useLevel="false">
<solid android:color="#FFE0E0E0" />
</shape>
</item>
<!-- 上层进度弧 -->
<item>
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%">
<shape android:shape="ring"
android:innerRadiusRatio="3"
android:thicknessRatio="8"
android:useLevel="false">
<gradient
android:startColor="#FF3F51B5"
android:endColor="#FF3F51B5"
android:angle="0" />
</shape>
</rotate>
</item>
</layer-list>
第二步:定义旋转动画属性
上面的代码中,我们已经给上层的进度弧添加了rotate标签,下面解释关键属性的含义:
fromDegrees:旋转起始角度,0表示从不旋转开始toDegrees:旋转结束角度,360表示旋转一周pivotX:旋转中心点的X坐标,50%表示中心位置pivotY:旋转中心点的Y坐标,50%表示中心位置
第三步:将动画应用到View上
把上面的XML文件保存为loading_spinner.xml,放在res/drawable目录下,然后在布局文件中通过ImageView引用这个drawable,同时给ImageView添加旋转动画:
<ImageView
android:id="@+id/loading_iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:src="@drawable/loading_spinner" />
接着在Activity或Fragment中给ImageView添加属性动画,实现持续旋转效果:
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView loadingIv = findViewById(R.id.loading_iv);
// 创建旋转动画,旋转属性为rotation,从0到360度,时长1000毫秒
ObjectAnimator animator = ObjectAnimator.ofFloat(loadingIv, "rotation", 0f, 360f);
animator.setDuration(1000);
// 设置动画重复次数为无限次
animator.setRepeatCount(ObjectAnimator.INFINITE);
// 设置动画重复模式为重新开始
animator.setRepeatMode(ObjectAnimator.RESTART);
animator.start();
}
}
自定义动画效果
我们可以根据需求调整动画的相关属性:
- 调整
setDuration的参数可以改变旋转速度,数值越小旋转越快 - 修改layer-list中shape的
innerRadiusRatio和thicknessRatio可以调整圆环的大小和粗细 - 修改solid或gradient的color属性可以调整动画的颜色,适配应用的主题色
注意事项
需要注意的是,如果直接在layer-list的rotate标签中设置android:toDegrees是无法实现自动循环的,必须配合属性动画或者补间动画来控制旋转循环。另外,使用ring形状的时候一定要设置android:useLevel="false",否则图形可能无法正常显示。
Androidlayer-listrotateSpinner动画修改时间:2026-07-04 06:57:12