最近在逛Github的时候发现了一个安卓加载中的动画框架AVLoadingIndicatorView,这个框架非常的不错,里面集合了各种各样的加载框架,有很多的样式可以选择。种类虽然比较多,但不是我想要的样式,此篇文章主要讲的是在其基础上封装一个自己想要的样式。
废话不多说,直接上图:
本来就是站在巨人的肩膀上的,至于其具体的用法我就不详细阐述了,给上大家github的地址,大家可以自己去看:https://github.com/81813780/AVLoadingIndicatorView
加载的动画虽然实现了,但是就我个人来说还是有几点需要加上的:
1 这个加载的动画没得文字配套。
2 加载的动画出现后背景没变化。
3 加载的动画出现后,界面上的东西仍然能进行点击或者触摸的操作。
当然每个人的需求不一样,这三点只是我个人认为需要加上的,于是自己就动手处理了。
实现后的效果是这样的:
不知道大家喜欢不喜欢,反正我个人感觉这样看着要好一点。
下面把代码贴出来:
1 动画弹出的工具类UIHelper
public class UIHelper {
/**
* 显示加载对话框
*
* @param context 上下文
* @param msg 对话框显示内容
*/
public static void showDialogForLoading(Context context, String msg) {
View view = LayoutInflater.from(context).inflate(R.layout.layout_loading_dialog, null);
TextView loadingText = (TextView) view.findViewById(R.id.id_tv_loading_dialog_text);
AVLoadingIndicatorView avLoadingIndicatorView = (AVLoadingIndicatorView) view.findViewById(R.id.AVLoadingIndicatorView);
loadingText.setText(msg);
final Dialog mLoadingDialog = new Dialog(context, R.style.loading_dialog_style);
mLoadingDialog.setCancelable(false);
mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
mLoadingDialog.show();
avLoadingIndicatorView.smoothToShow();
mLoadingDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
mLoadingDialog.hide();
return true;
}
return false;
}
});
}
}
2 Dialog的布局文件layout_loading_dialog:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/bg_loading_dialog_shape"
android:gravity="center"
android:minHeight="60dp"
android:minWidth="180dp"
android:orientation="vertical"
android:padding="10dp">
<com.wang.avi.AVLoadingIndicatorView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/AVLoadingIndicatorView"
app:indicatorColor="#1390ea"
app:indicatorName="PacmanIndicator"/>
<TextView
android:id="@+id/id_tv_loading_dialog_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="加载中…"
android:textColor="#555555"
android:textSize="14sp" />
</LinearLayout>
3 Dialog的样式loading_dialog_stytle:
<!-- 自定义Loading Dialog -->
<style name="loading_dialog_style" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
以上的几点实现后就可以在你想要的地方加上一句代码 UIHelper.showDialogForLoading(MainActivity.this,"正在加载。。。");即可,当然这边只是单纯的为了展示效果并没有加上主动消失掉加载动画的代码,这个大家如果感兴趣可以自己添加,比如数据请求开始的时候动画开始,数据请求结束的时候动画结束等。
最后还是想说非常感谢安卓的开源,大神的分享!