因为公司业务需要,需要在每一个页面请求网络的时候,显示加载中的动画,当请求完毕时,需要隐藏动画,所以考虑自定义一个Dialog放在BaseActivity中,在BaseActivity中暴露出来两个方法,一个用于显示加载动画,一个用来隐藏加载动画。在这里考虑使用帧动画实现。
自定义Dialog的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/loadingIv"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"
android:layout_centerInParent="true"
android:background="@drawable/animation_loading_running" />
<TextView
android:id="@+id/loadingTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/loadingIv"
android:layout_centerInParent="true"
android:textColor="@color/white"
android:textSize="@dimen/sp_14"
tools:text="正在加载中..." />
</RelativeLayout>
效果图如下(动图略小。。。):
帧动画布局文件如下,其实就是7张连续的图片:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--网络加载中动画-->
<item
android:drawable="@mipmap/ic_loading_run01"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run02"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run03"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run04"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run05"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run06"
android:duration="150" />
<item
android:drawable="@mipmap/ic_loading_run07"
android:duration="150" />
</animation-list>
自定义Dialog类如下:
package cn.oneday.customloadingdialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
/**
* @Description:自定义加载框
*/
public class CustomProgressDialog extends ProgressDialog {
private AnimationDrawable mAnimation;
private Context mContext;
private ImageView mImageView;
private String mLoadingTip;
private TextView mLoadingTv;
private int mResid;
public CustomProgressDialog(Context context, String content, int theme, int id) {
super(context, theme);
this.mContext = context;
this.mLoadingTip = content;
this.mResid = id;
setCanceledOnTouchOutside(false);// 设置不能点击对话框外边取消当前对话框
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData();
}
private void initData() {
mImageView.setBackgroundResource(mResid);
// 通过ImageView对象拿到背景显示的AnimationDrawable
mAnimation = (AnimationDrawable) mImageView.getBackground();
// 为了防止在onCreate方法中只显示第一帧的解决方案之一
mImageView.post(new Runnable() {
@Override
public void run() {
mAnimation.start();
}
});
mLoadingTv.setText(mLoadingTip);
}
public void setContent(String str) {
mLoadingTv.setText(str);
}
private void initView() {
setContentView(R.layout.progress_loading_dialog);
mLoadingTv = (TextView) findViewById(R.id.loadingTv);
mImageView = (ImageView) findViewById(R.id.loadingIv);
}
}
在Activity中使用:
package cn.oneday.customloadingdialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;
public class MainActivity extends AppCompatActivity {
private CustomProgressDialog customProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
customProgressDialog = new CustomProgressDialog(this, "拼命加载中...", R.style.Dialog_Fullscreen, R.drawable.animation_loading_running);
// customProgressDialog.setCancelable(false); // 设置不响应返回按钮点击事件
customProgressDialog.show();
// 动态设置自定义Dialog的显示内容的宽和高
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); //为获取屏幕宽、高
android.view.WindowManager.LayoutParams p = customProgressDialog.getWindow().getAttributes(); //获取对话框当前的参数值
p.height = (int) (d.getHeight() * 0.3); //高度设置为屏幕的0.3
p.width = d.getWidth(); //宽度设置为全屏
customProgressDialog.getWindow().setAttributes(p); //设置生效
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--加载进度对话框样式-->
<style name="Dialog_Fullscreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">false</item><!--半透明-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
<item name="android:backgroundDimEnabled">true</item><!--模糊-->
</style>
</resources>
以此记录,方便以后查阅,如有错误,请指正,万分感谢!