我们在开发Android上应用程序时,有很多时候会遇到“延时”等待的情况,例如数据加载时,尤其是在联网的时候,请求网络会有个等待时间,在这个等待的时间里需要给用户一个友好的提示,提示用户现在正在做什么操作,需要耐心等待等等,这时一个进度对话框就可以解决。Android提供给我们一个很好的控件叫ProgressDialog,用来创建自定义信息以及一些相关操作,唯一不好的一点就是Android原生控件给我一种一如既往的单调和丑陋,下面是原生ProgressDialog的源码以及效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
MainActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressDialog dialog =
new
ProgressDialog(
this
);
dialog.setMessage(登录中……);
dialog.show();
}
}
|
源码极其简单,效果也极其简陋,怎么看怎么不爽。那么怎样让这个ProgressDialog看起来爽点呢?其实不妨做一个自定义的ProgressDialog,先看一下自定义ProgressDialog的效果吧!
好了,看上去不错吧!下面开始一步一步来实现!
1,自定义ProgressDialog的布局。
1
2
3
4
5
6
7
8
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<linearlayout android:background=
"@drawable/progress_custom_bg"
android:gravity=
"center_horizontal"
android:layout_gravity=
"center"
android:layout_height=
"wrap_content"
android:layout_width=
"wrap_content"
android:orientation=
"vertical"
android:paddingbottom=
"20dp"
android:paddingleft=
"30dp"
android:paddingright=
"30dp"
android:paddingtop=
"20dp"
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<imageview android:background=
"@anim/spinner"
android:id=
"@+id/spinnerImageView"
android:layout_height=
"wrap_content"
android:layout_width=
"wrap_content"
>
<textview android:id=
"@+id/message"
android:layout_height=
"wrap_content"
android:layout_margintop=
"15dp"
android:layout_width=
"wrap_content"
android:text=
"Message"
android:textcolor=
"#FFFFFF"
>
</textview></imageview></linearlayout>
|
2,滚动条的背景设置。
上面的XML布局中可以看到滚动条是一个ImageView,需要给ImageView设置一个动态的背景,那这个动态的背景该怎么办呢?其实就是给ImageView一个动画背景,给出一定数量的图片,在动画中按一定时间匀速切换图片即可,图片资源如下:
在res/anim文件夹建立这样一个动画集spinner.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<item android:drawable=
"@drawable/spinner_0"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_1"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_2"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_3"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_4"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_5"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_6"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_7"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_8"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_9"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_10"
android:duration=
"60/"
>
<item android:drawable=
"@drawable/spinner_11"
android:duration=
"60/"
>
</item></item></item></item></item></item></item></item></item></item></item></item></animation-list>
|
1
2
3
4
5
6
7
8
|
<!--?xml version=
1.0
encoding=UTF-
8
?-->
<solid android:color=
"#ff404040"
>
<corners android:bottomleftradius=
"8dp"
android:bottomrightradius=
"8dp"
android:topleftradius=
"8dp"
android:toprightradius=
"8dp"
>
</corners></solid></shape>
|
然后还需要给自定义ProgressDialog设置一个风格,在res/value/style.xml下这样定义:
1
2
3
4
5
6
7
|
<!-- 自定义Dialog --><style name=
"Custom_Progress"
parent=
"@android:style/Theme.Dialog"
type=
"text/css"
><item name=android:windowFrame>
@null
</item>
<item name=android:windowIsFloating>
true
</item>
<item name=android:windowContentOverlay>
@null
</item>
<item name=android:windowAnimationStyle>
@android
:style/Animation.Dialog</item>
<item name=android:windowSoftInputMode>stateUnspecified|adjustPan</item>
<item name=android:windowBackground>
@android
:color/transparent</item>
<item name=android:windowNoTitle>
true
</item></style>
|
3,接下来进入重点,我们通过代码来构建一个自定义的ProgressDialog,具体做法就是自定义类继承Dialog:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
package
com.example.myexample;
import
android.app.Dialog;
import
android.content.Context;
import
android.graphics.drawable.AnimationDrawable;
import
android.view.Gravity;
import
android.view.View;
import
android.view.WindowManager;
import
android.widget.ImageView;
import
android.widget.TextView;
public
class
CustomProgress
extends
Dialog {
public
CustomProgress(Context context) {
super
(context);
}
public
CustomProgress(Context context,
int
theme) {
super
(context, theme);
}
/**
* 当窗口焦点改变时调用
*/
public
void
onWindowFocusChanged(
boolean
hasFocus) {
ImageView imageView = (ImageView) findViewById(R.id.spinnerImageView);
// 获取ImageView上的动画背景
AnimationDrawable spinner = (AnimationDrawable) imageView.getBackground();
// 开始动画
spinner.start();
}
/**
* 给Dialog设置提示信息
*
* @param message
*/
public
void
setMessage(CharSequence message) {
if
(message !=
null
&& message.length() >
0
) {
findViewById(R.id.message).setVisibility(View.VISIBLE);
TextView txt = (TextView) findViewById(R.id.message);
txt.setText(message);
txt.invalidate();
}
}
/**
* 弹出自定义ProgressDialog
*
* @param context
* 上下文
* @param message
* 提示
* @param cancelable
* 是否按返回键取消
* @param cancelListener
* 按下返回键监听
* @return
*/
public
static
CustomProgress show(Context context, CharSequence message,
boolean
cancelable, OnCancelListener cancelListener) {
CustomProgress dialog =
new
CustomProgress(context, R.style.Custom_Progress);
dialog.setTitle();
dialog.setContentView(R.layout.progress_custom);
if
(message ==
null
|| message.length() ==
0
) {
dialog.findViewById(R.id.message).setVisibility(View.GONE);
}
else
{
TextView txt = (TextView) dialog.findViewById(R.id.message);
txt.setText(message);
}
// 按返回键是否取消
dialog.setCancelable(cancelable);
// 监听返回键处理
dialog.setOnCancelListener(cancelListener);
// 设置居中
dialog.getWindow().getAttributes().gravity = Gravity.CENTER;
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
// 设置背景层透明度
lp.dimAmount =
0
.2f;
dialog.getWindow().setAttributes(lp);
// dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
dialog.show();
return
dialog;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
public
class
MainActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomProgress.show(
this
, 登录中...,
true
,
null
);
}
}
|