以前和大家讲过一次,但是没贴图,这次我整理下,重新书写下。
首先,创建一个布局,这个布局我用到了cardView。大家可以考虑可以不用。loading.xml
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardBackgroundColor="@color/color_white_stranspate"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="0dp" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="10dp" >
<ProgressBar
android:id="@+id/loading_animato"
style="@style/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/loading_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center"
android:textSize="14sp" />
LinearLayout>
android.support.v7.widget.CardView>
color_white_stranspate 的色值#F6F3EE
然后在Style.xml中配置loading和dialog属性
-- 加载滚动条样式 -->
-- 配置dialog样式 -->
在drawable文件夹中,创建progressloading.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<rotate
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
<bitmap
android:antialias="true"
android:filter="true"
android:src="@drawable/loading" />
rotate>
item>
layer-list>
其中loading图片大家选择一张。就是只要一张如上图的图片就ok了。
这些完成后,我们奉上我们的dialog加载框工具类。
/**
* @类名:ProgressDialogUtil
* @类描述:pdf Reader全局加载框
*/
public class ProgressDialogUtil {
private static final int START_DIALOG = 0;//开始对话框
private static final int UPDATE_DIALOG = 1;//更新对话框
private static final int STOP_DIALOG = 2;//销毁对话框
private static AlertDialog dialog = null;
private static TextView title = null;
private static Context context = null;
private static Handler handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(android.os.Message msg) {
String message = "";
switch (msg.what) {
case START_DIALOG:// 启动加载框
message = (String) msg.obj;
if (dialog != null) {
stopLoad();
startLoad(message);
return;
}
init(message);
isTouchDismiss(true);
break;
case UPDATE_DIALOG:// 更新加载框
message = (String) msg.obj;
if (title.VISIBLE == View.VISIBLE) {
if (StringUtils.isEmpty(message)) {
title.setVisibility(View.GONE);
} else {
title.setText(message);
}
} else {
if (!StringUtils.isEmpty(message)) {
title.setText(message);
title.setVisibility(View.VISIBLE);
}
}
break;
case STOP_DIALOG:// 停止加载框
if (dialog != null) {
dialog.dismiss();
dialog.cancel();
dialog = null;
title = null;
}
break;
}
};
};
/**
* @方法说明:加载控件与布局
* @方法名称:init
* @返回值:void
*/
private static void init(String mssg) {
if (SystemTool.isBackground(context)) {// 如果程序在后台,则不加载
return;
}
if (null != context) {
LayoutInflater flat = LayoutInflater.from(context);
View v = flat.inflate(R.layout.loading, null);
// v.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
// 创建对话
dialog = new AlertDialog.Builder(context, R.style.dialog).create();
// 设置返回键点击消失对话框
dialog.setCancelable(true);
// 设置点击返回框外边不消失
dialog.setCanceledOnTouchOutside(true);
// 给该对话框增加系统权限
// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
// 显示对话
dialog.show();
// 加载控件
title = (TextView) v.findViewById(R.id.loading_title);
if (StringUtils.isEmpty(mssg)) {
title.setVisibility(View.GONE);
} else {
title.setVisibility(View.VISIBLE);
title.setText(mssg);
}
// 必须放到显示对话框下面,否则显示不出效果
Window window = dialog.getWindow();
// window.getAttributes().x = 0;
// window.getAttributes().y = 0;//设置y坐标
WindowManager.LayoutParams params = window.getAttributes();
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
// params.alpha = 0.6f;
window.setAttributes(params); // 加载布局组件
dialog.getWindow().setContentView(v);
}
}
/**
* @方法说明:启动对话框
* @方法名称:startLoad
* @param con
* @param msg
* @返回值:void
*/
public static void startLoad(String msg) {
context = ActivityManager.newInstance().currentActivity();// 获取当前的activity的上下文
if (context == null) {
return;
}
if (SystemTool.isBackground(context)) {// 如果程序在后台,则不加载
return;
}
Message mssage = new Message();
mssage.what = START_DIALOG;
mssage.obj = msg;
handler.sendMessage(mssage);
}
/**
* @方法说明:更新显示的内容
* @方法名称:UpdateMsg
* @param msg
* @返回值:void
*/
public static void UpdateMsg(String msg) {
Message message = new Message();
message.what = UPDATE_DIALOG;
message.obj = msg;
handler.sendMessage(message);
}
/**
* @方法说明:允许加载条转动的时候去点击系统返回键
* @方法名称:openCancelable
* @param flag
* @返回值:void
*/
public static void openCancelable(boolean flag) {
if (dialog != null) {
dialog.setCancelable(flag);
}
}
/**
* @方法说明:允许点击对话框触摸消失
* @方法名称:isTouchDismiss
* @param isdimiss
* @返回值:void
*/
public static void isTouchDismiss(boolean isdimiss) {
if (dialog != null) {
dialog.setCanceledOnTouchOutside(isdimiss);
}
}
/**
* @方法说明:让警告框消失
* @方法名称:dismiss
* @返回值:void
*/
public static void stopLoad() {
handler.sendEmptyMessage(STOP_DIALOG);
}
}
/**
* @方法说明:判断当前应用程序是否后台运行
* @方法名称:isBackground
* @param context
* @return
* @返回值:boolean
*/
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List appProcesses = activityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
// 后台运行
return true;
} else {
// 前台运行
return false;
}
}
}
return false;
}
关于ActivityManager.newInstance().currentActivity();其实大家可以从外部传进来就可以了,这个就是上下文。
改成这样就可以了:
ProgressDialogUtil.startLoad(Context context, String message);
不过切记这个context,必须是activity类型的上下文,或者FragmentActivity类型的上下文。
最后,当大家在你向需要用到的时候,你只需要
ProgressDialogUtil.startLoad(“”);//只显示菊花,不显示文本
ProgressDialogUtil.startLoad(“刷新中…”);//显示菊花,显示文本
当你用完后,需要停止的时候,只要这样调用就可以了:
ProgressDialogUtil.stopLoad();
如果你不想stop掉它,而是更新dialog的显示文本内容:
ProgressDialogUtil.UpdateMsg(“更新了…”);
是不是很简单,有很方便啊!
补充下:
如果你想自动dialog位置的话,可以如下操作:
// 必须放到显示对话框下面,否则显示不出效果
Window window = dialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
int width = Math.min(ScreenUtil.getScreenWidth(context), ScreenUtil.getScreenHeight(context)) * 3 / 5;
params.width = width;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
// params.gravity = Gravity.LEFT | Gravity.TOP;
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
params.horizontalMargin = 0.05F;
params.verticalMargin = 0.1F;
// params.x = ScreenUtil.dip2px(context, 15);
// params.y = ScreenUtil.getScreenHeight(context) -
// ScreenUtil.dip2px(context, 345) - parentHeight;
window.setAttributes(params);
// 加载布局组件
dialog.getWindow().setContentView(v);
同时你要是好像自定义dialog的style的话,可以如下操作:
详细的注释我已经添加了,想必应该没有不懂得了!呵呵