Android自定义ProgressDialog

 转载请注明出处:http://blog.csdn.net/allen315410/article/details/41699063 

       我们在开发Android上应用程序时,有很多时候会遇到“延时”等待的情况,例如数据加载时,尤其是在联网的时候,请求网络会有个等待时间,在这个等待的时间里需要给用户一个友好的提示,提示用户现在正在做什么操作,需要耐心等待等等,这时一个进度对话框就可以解决。Android提供给我们一个很好的控件叫ProgressDialog,用来创建自定义信息以及一些相关操作,唯一不好的一点就是Android原生控件给我一种一如既往的单调和丑陋,下面是原生ProgressDialog的源码以及效果:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         ProgressDialog dialog = new ProgressDialog(this);  
  9.         dialog.setMessage("登录中……");  
  10.         dialog.show();  
  11.   
  12.     }  
  13. }  


       源码极其简单,效果也极其简陋,怎么看怎么不爽。那么怎样让这个ProgressDialog看起来爽点呢?其实不妨做一个自定义的ProgressDialog,先看一下自定义ProgressDialog的效果吧!


好了,看上去不错吧!下面开始一步一步来实现!

1,自定义ProgressDialog的布局。

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_gravity="center"  
  6.     android:background="@drawable/progress_custom_bg"  
  7.     android:gravity="center_horizontal"  
  8.     android:orientation="vertical"  
  9.     android:paddingBottom="20dp"  
  10.     android:paddingLeft="30dp"  
  11.     android:paddingRight="30dp"  
  12.     android:paddingTop="20dp" >  
  13.   
  14.     <ImageView  
  15.         android:id="@+id/spinnerImageView"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:background="@anim/spinner" />  
  19.   
  20.     <TextView  
  21.         android:id="@+id/message"  
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.         android:layout_marginTop="15dp"  
  25.         android:text="Message"  
  26.         android:textColor="#FFFFFF" />  
  27.   
  28. </LinearLayout>  

2,滚动条的背景设置。

上面的XML布局中可以看到滚动条是一个ImageView,需要给ImageView设置一个动态的背景,那这个动态的背景该怎么办呢?其实就是给ImageView一个动画背景,给出一定数量的图片,在动画中按一定时间匀速切换图片即可,图片资源如下:


在res/anim文件夹建立这样一个动画集spinner.xml:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:oneshot="false" >  
  3.   
  4.     <item  
  5.         android:drawable="@drawable/spinner_0"  
  6.         android:duration="60"/>  
  7.     <item  
  8.         android:drawable="@drawable/spinner_1"  
  9.         android:duration="60"/>  
  10.     <item  
  11.         android:drawable="@drawable/spinner_2"  
  12.         android:duration="60"/>  
  13.     <item  
  14.         android:drawable="@drawable/spinner_3"  
  15.         android:duration="60"/>  
  16.     <item  
  17.         android:drawable="@drawable/spinner_4"  
  18.         android:duration="60"/>  
  19.     <item  
  20.         android:drawable="@drawable/spinner_5"  
  21.         android:duration="60"/>  
  22.     <item  
  23.         android:drawable="@drawable/spinner_6"  
  24.         android:duration="60"/>  
  25.     <item  
  26.         android:drawable="@drawable/spinner_7"  
  27.         android:duration="60"/>  
  28.     <item  
  29.         android:drawable="@drawable/spinner_8"  
  30.         android:duration="60"/>  
  31.     <item  
  32.         android:drawable="@drawable/spinner_9"  
  33.         android:duration="60"/>  
  34.     <item  
  35.         android:drawable="@drawable/spinner_10"  
  36.         android:duration="60"/>  
  37.     <item  
  38.         android:drawable="@drawable/spinner_11"  
  39.         android:duration="60"/>  
  40. </animation-list>  
然后给整个的ProgressDialog设置一个背景色progress_custom_bg.xml:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <solid android:color="#ff404040" />  
  5.   
  6.     <corners  
  7.         android:bottomLeftRadius="8dp"  
  8.         android:bottomRightRadius="8dp"  
  9.         android:topLeftRadius="8dp"  
  10.         android:topRightRadius="8dp" />  
  11.   
  12. </shape>  

然后还需要给自定义ProgressDialog设置一个风格,在res/value/style.xml下这样定义:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 自定义Dialog -->  
  2. <style name="Custom_Progress" parent="@android:style/Theme.Dialog">  
  3.     <item name="android:windowFrame">@null</item>  
  4.     <item name="android:windowIsFloating">true</item>  
  5.     <item name="android:windowContentOverlay">@null</item>  
  6.     <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>  
  7.     <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>  
  8.     <item name="android:windowBackground">@android:color/transparent</item>  
  9.     <item name="android:windowNoTitle">true</item>  
  10. </style>  

3,接下来进入重点,我们通过代码来构建一个自定义的ProgressDialog,具体做法就是自定义类继承Dialog:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.example.myexample;  
  2.   
  3. import android.app.Dialog;  
  4. import android.content.Context;  
  5. import android.graphics.drawable.AnimationDrawable;  
  6. import android.view.Gravity;  
  7. import android.view.View;  
  8. import android.view.WindowManager;  
  9. import android.widget.ImageView;  
  10. import android.widget.TextView;  
  11.   
  12. public class CustomProgress extends Dialog {  
  13.     public CustomProgress(Context context) {  
  14.         super(context);  
  15.     }  
  16.   
  17.     public CustomProgress(Context context, int theme) {  
  18.         super(context, theme);  
  19.     }  
  20.   
  21.     /** 
  22.      * 当窗口焦点改变时调用 
  23.      */  
  24.     public void onWindowFocusChanged(boolean hasFocus) {  
  25.         ImageView imageView = (ImageView) findViewById(R.id.spinnerImageView);  
  26.         // 获取ImageView上的动画背景  
  27.         AnimationDrawable spinner = (AnimationDrawable) imageView.getBackground();  
  28.         // 开始动画  
  29.         spinner.start();  
  30.     }  
  31.   
  32.     /** 
  33.      * 给Dialog设置提示信息 
  34.      *  
  35.      * @param message 
  36.      */  
  37.     public void setMessage(CharSequence message) {  
  38.         if (message != null && message.length() > 0) {  
  39.             findViewById(R.id.message).setVisibility(View.VISIBLE);  
  40.             TextView txt = (TextView) findViewById(R.id.message);  
  41.             txt.setText(message);  
  42.             txt.invalidate();  
  43.         }  
  44.     }  
  45.   
  46.     /** 
  47.      * 弹出自定义ProgressDialog 
  48.      *  
  49.      * @param context 
  50.      *            上下文 
  51.      * @param message 
  52.      *            提示 
  53.      * @param cancelable 
  54.      *            是否按返回键取消 
  55.      * @param cancelListener 
  56.      *            按下返回键监听 
  57.      * @return 
  58.      */  
  59.     public static CustomProgress show(Context context, CharSequence message, boolean cancelable, OnCancelListener cancelListener) {  
  60.         CustomProgress dialog = new CustomProgress(context, R.style.Custom_Progress);  
  61.         dialog.setTitle("");  
  62.         dialog.setContentView(R.layout.progress_custom);  
  63.         if (message == null || message.length() == 0) {  
  64.             dialog.findViewById(R.id.message).setVisibility(View.GONE);  
  65.         } else {  
  66.             TextView txt = (TextView) dialog.findViewById(R.id.message);  
  67.             txt.setText(message);  
  68.         }  
  69.         // 按返回键是否取消  
  70.         dialog.setCancelable(cancelable);  
  71.         // 监听返回键处理  
  72.         dialog.setOnCancelListener(cancelListener);  
  73.         // 设置居中  
  74.         dialog.getWindow().getAttributes().gravity = Gravity.CENTER;  
  75.         WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();  
  76.         // 设置背景层透明度  
  77.         lp.dimAmount = 0.2f;  
  78.         dialog.getWindow().setAttributes(lp);  
  79.         // dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);  
  80.         dialog.show();  
  81.         return dialog;  
  82.     }  
  83. }  
在Activity中引用自定义ProgressDialog:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         CustomProgress.show(this"登录中..."truenull);  
  9.   
  10.     }  
  11. }  
好了,整个流程结束,我们简单的自定义进度对话框就做好了,效果在上面已经截图了,这里不再贴出。里面的代码我就不解释了,都比较简单而且有一些注释。喜欢的朋友,请在下方点击下载源码。


源码请在这里下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值