本文中的动画,类属于Tween动画。
首先,看效果图。
1. 建立动画布局文件
路径:res\layout\loading_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="1"
android:gravity="center"
android:minHeight="80dp"
android:minWidth="80dp"
android:orientation="vertical"
android:padding="10dp" >
<ImageView
android:id="@+id/img_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/loading"
android:contentDescription="@null"
android:layout_centerInParent="true" />
<TextView
android:id="@+id/text_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center_horizontal"
android:layout_centerInParent="true"
android:textColor="@android:color/primary_text_light" />
</RelativeLayout>
注意:布局文件中,两个控件ImageView与TextView的位置android:layout_centerInParent=”true”是关键,只有这样,图片与文字才会重合。
2. 建立Tween动画文件
路径:res\anim\rotating.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<!--
旋转动画
1.每1.5秒旋转一周
2.线性旋转(匀速)
3.转轴位于屏幕中心
4.repeatCount设置为-1,声明为不断重复
5.repeateMode设置为restart,声明为重新开始
-->
<rotate
android:duration="1500"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="-1"
android:repeatMode="restart"
android:startOffset="-1"
android:toDegrees="+360" />
</set>
3. 设置Dialog的style
路径:res\values\styles.xml
在styles.xml文件中添加如下代码段,规定要显示的Dialog的效果。
<!-- 继承于Dialog主题的style -->
<style name="loading" parent="android:style/Theme.Dialog">
<!-- Dialog的windowFrame框为无 -->
<item name="android:windowFrame">@null</item>
<!-- Dialog无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- Dialog的背景 -->
<item name="android:windowBackground">@color/transparent</item>
<!-- Dialog是否悬浮显示 -->
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
4. 创建自定义Dialog
继承Android系统提供的Dialog,创建自定义Dialog。
在该自定义Dialog中,需要引用动画布局文件loading_dialog.xml。
@SuppressLint("InflateParams")
public class LoadingDialog extends Dialog {
private RelativeLayout dialogView;// 显示动画
private ImageView loadingImg;// 动画
private TextView tipText;// 文本
public LoadingDialog(Context context, int themeResId, String msg) {
/*
* 这里是自定义Dialog显示效果的关键,
* 一定要把themeResId传进去。
*/
super(context, themeResId);
// 加载布局文件
View view = LayoutInflater.from(context).inflate(R.layout.loading_dialog, null, false);
// 获取布局文件上的控件
dialogView = (RelativeLayout) view.findViewById(R.id.dialog_view);
loadingImg = (ImageView) view.findViewById(R.id.img_loading);
tipText = (TextView) view.findViewById(R.id.text_tip);
// 加载动画效果
Animation rotating = AnimationUtils.loadAnimation(context, R.anim.rotating);
// 将动画加载到 ImageView 上,开启动画
loadingImg.startAnimation(rotating);
// 添加文本提示
tipText.setText(msg);
// 设置动画为不可取消
setCancelable(false);
// 将动画设置在相应的位置
setContentView(dialogView,
new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
}
5. 显示与取消显示Dialog
在要显示动画的地方,引用自定义style,创建一个Dialog对象。
// 上下文环境,Dialog的style,提示文本
dialog = new LoadingDialog(this, R.style.loading, "加载中……");
然后,显示Dialog。
dialog.show();
在合适的地方,关闭Dialog。
dialog.cancel();