Android自定义ProgressDialog

我们在开发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>
然后给整个的ProgressDialog设置一个背景色progress_custom_bg.xml:

 

 

?
1
2
3
4
5
6
7
8
<!--?xml version= 1.0 encoding=UTF- 8 ?-->
<shape xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <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;
     }
}
在Activity中引用自定义ProgressDialog:

 

 

?
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 );
 
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值