自定义ProgressDialog进度条对话框的实现

Android SDK已经提供有进度条组件ProgressDialog组件,但用的时候我们会发现可能风格与我们应用的整体风格不太搭配,而且ProgressDialog的可定制性也不太强,这时就需要我们自定义实现一个ProgressDialog。
通过看源码我们发现,ProgressDialog继承自Alertdialog,有一个ProgressBar和两个TextView组成的,通过对ProgressDialog的源码进行改进就可以实现一个自定义的ProgressDialog。

1、效果:

首先看一下自定义CommonProgressDialog和原生ProgressDialog的对比:

自定义ProgressDialog进度条对话框的实现_第1张图片

自定义ProgressDialog进度条对话框的实现_第2张图片


2、代码:

common_progress_dialog.xml 布局文件:

[html]  view plain copy
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content">  
  5. <LinearLayout   
  6.     android:layout_width="798px"  
  7.     android:layout_height="460px"  
  8.     android:orientation="vertical"  
  9.     android:background="@drawable/common_progress_dialog_background">  
  10.     <TextView  
  11.             android:id="@+id/progress_message"  
  12.             android:layout_width="wrap_content"  
  13.             android:layout_height="wrap_content"  
  14.             android:textSize="44px"  
  15.             android:layout_marginTop="113px"  
  16.             android:layout_gravity="center_horizontal"  
  17.             android:textColor="#ffffff"  
  18.         />  
  19.         <ProgressBar   
  20.         android:id="@+id/progress"  
  21.             style="?android:attr/progressBarStyleHorizontal"  
  22.             android:layout_width="712px"  
  23.             android:layout_height="30px"  
  24.             android:layout_marginTop="100px"  
  25.             android:layout_marginLeft="47px"  
  26.             android:layout_centerHorizontal="true"  
  27.             android:progressDrawable="@drawable/common_progressdialog_progressbar_background"  
  28.         />  
  29.             
  30.         <LinearLayout   
  31.             android:layout_width="wrap_content"  
  32.             android:layout_height="wrap_content"  
  33.             android:orientation="horizontal"  
  34.             >  
  35.         <TextView  
  36.             android:id="@+id/progress_percent"  
  37.             android:layout_width="80px"  
  38.             android:layout_height="wrap_content"  
  39.             android:textSize="30px"  
  40.             android:layout_marginLeft="280px"  
  41.             android:gravity="center_horizontal"  
  42.             android:textColor="#ffffff"  
  43.         />  
  44.         <TextView  
  45.             android:id="@+id/progress_number"  
  46.             android:layout_width="250px"  
  47.             android:layout_height="wrap_content"  
  48.             android:layout_marginLeft="120px"  
  49.             android:textSize="30px"  
  50.             android:gravity="center_horizontal"  
  51.             android:textColor="#ffffff"  
  52.         />  
  53.         LinearLayout>  
  54. LinearLayout>  
  55. FrameLayout>  


common_progressdialog_progressbar_background.xml Progressbar进度条图片和背景图片设置

[html]  view plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     >  
  4.     <item  
  5.         android:id="@android:id/background"  
  6.         android:drawable="@drawable/common_progress_dialog_progressbar3"  
  7.         />  
  8.     <item  
  9.         android:id="@android:id/progress"  
  10.         android:drawable="@drawable/common_progress_dialog_progressbar2"  
  11.         />  
  12.       
  13. layer-list>  



CommonProgressDialog.java类:


[java]  view plain copy
  1. package com.johnny.testactivity;  
  2.   
  3.   
  4. import java.text.NumberFormat;  
  5.   
  6.   
  7. import android.app.AlertDialog;  
  8. import android.app.ProgressDialog;  
  9. import android.content.Context;  
  10. import android.os.Bundle;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.text.Spannable;  
  14. import android.text.SpannableString;  
  15. import android.text.style.StyleSpan;  
  16. import android.util.Log;  
  17. import android.view.LayoutInflater;  
  18. import android.view.View;  
  19. import android.widget.ProgressBar;  
  20. import android.widget.TextView;  
  21.   
  22.   
  23. public class CommonProgressDialog extends AlertDialog {  
  24.   
  25.   
  26.     private ProgressBar mProgress;  
  27.     private TextView mProgressNumber;  
  28.     private TextView mProgressPercent;  
  29.     private TextView mProgressMessage;  
  30.       
  31.     private Handler mViewUpdateHandler;  
  32.     private int mMax;  
  33.     private CharSequence mMessage;  
  34.     private boolean mHasStarted;  
  35.     private int mProgressVal;  
  36.       
  37.     private String TAG="CommonProgressDialog";  
  38.     private String mProgressNumberFormat;  
  39.     private NumberFormat mProgressPercentFormat;  
  40.     public CommonProgressDialog(Context context) {  
  41.         super(context);  
  42.         // TODO Auto-generated constructor stub  
  43.         initFormats();  
  44.     }  
  45.   
  46.   
  47.     @Override  
  48.     protected void onCreate(Bundle savedInstanceState) {  
  49.         // TODO Auto-generated method stub  
  50.         super.onCreate(savedInstanceState);  
  51.         setContentView(R.layout.common_progress_dialog);  
  52.         mProgress=(ProgressBar) findViewById(R.id.progress);  
  53.         mProgressNumber=(TextView) findViewById(R.id.progress_number);  
  54.         mProgressPercent=(TextView) findViewById(R.id.progress_percent);  
  55.         mProgressMessage=(TextView) findViewById(R.id.progress_message);  
  56. //      LayoutInflater inflater = LayoutInflater.from(getContext());  
  57.         mViewUpdateHandler = new Handler() {  
  58.   
  59.   
  60.             @Override  
  61.             public void handleMessage(Message msg) {  
  62.                 // TODO Auto-generated method stub  
  63.                 super.handleMessage(msg);  
  64.                 int progress = mProgress.getProgress();  
  65.                 int max = mProgress.getMax();  
  66.                 double dProgress = (double)progress/(double)(1024 * 1024);  
  67.                 double dMax = (double)max/(double)(1024 * 1024);  
  68.                 if (mProgressNumberFormat != null) {  
  69.                     String format = mProgressNumberFormat;  
  70.                     mProgressNumber.setText(String.format(format, dProgress, dMax));  
  71.                 } else {  
  72.                     mProgressNumber.setText("");  
  73.                 }  
  74.                 if (mProgressPercentFormat != null) {  
  75.                     double percent = (double) progress / (double) max;  
  76.                     SpannableString tmp = new SpannableString(mProgressPercentFormat.format(percent));  
  77.                     tmp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD),  
  78.                             0, tmp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  79.                     mProgressPercent.setText(tmp);  
  80.                 } else {  
  81.                     mProgressPercent.setText("");  
  82.                 }  
  83.             }  
  84.               
  85.         };  
  86. //      View view = inflater.inflate(R.layout.common_progress_dialog, null);  
  87. //        mProgress = (ProgressBar) view.findViewById(R.id.progress);  
  88. //        mProgressNumber = (TextView) view.findViewById(R.id.progress_number);  
  89. //        mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);  
  90. //        setView(view);  
  91.         //mProgress.setMax(100);  
  92.         onProgressChanged();  
  93.         if (mMessage != null) {  
  94.             setMessage(mMessage);  
  95.         }  
  96.         if (mMax > 0) {  
  97.             setMax(mMax);  
  98.         }  
  99.         if (mProgressVal > 0) {  
  100.             setProgress(mProgressVal);  
  101.         }  
  102.     }  
  103.     private void initFormats() {  
  104.         mProgressNumberFormat = "%1.2fM/%2.2fM";  
  105.         mProgressPercentFormat = NumberFormat.getPercentInstance();  
  106.         mProgressPercentFormat.setMaximumFractionDigits(0);  
  107.     }  
  108.     private void onProgressChanged() {  
  109.         mViewUpdateHandler.sendEmptyMessage(0);  
  110.   
  111.   
  112.     }  
  113.     public void setProgressStyle(int style) {  
  114.         //mProgressStyle = style;  
  115.     }  
  116.     public int getMax() {  
  117.         if (mProgress != null) {  
  118.             return mProgress.getMax();  
  119.         }  
  120.         return mMax;  
  121.     }  
  122.     public void setMax(int max) {  
  123.         if (mProgress != null) {  
  124.             mProgress.setMax(max);  
  125.             onProgressChanged();  
  126.         } else {  
  127.             mMax = max;  
  128.         }  
  129.     }  
  130.     public void setIndeterminate(boolean indeterminate) {  
  131.         if (mProgress != null) {  
  132.             mProgress.setIndeterminate(indeterminate);  
  133.         }   
  134. //      else {  
  135. //            mIndeterminate = indeterminate;  
  136. //        }  
  137.     }  
  138.     public void setProgress(int value) {  
  139.         if (mHasStarted) {  
  140.             mProgress.setProgress(value);  
  141.             onProgressChanged();  
  142.         } else {  
  143.             mProgressVal = value;  
  144.         }   
  145.     }  
  146.   
  147.   
  148.     @Override  
  149.     public void setMessage(CharSequence message) {  
  150.         // TODO Auto-generated method stub  
  151.         //super.setMessage(message);  
  152.         if(mProgressMessage!=null){  
  153.             mProgressMessage.setText(message);  
  154.         }  
  155.         else{  
  156.             mMessage = message;  
  157.         }  
  158.     }  
  159.   
  160.   
  161.     @Override  
  162.     protected void onStart() {  
  163.         // TODO Auto-generated method stub  
  164.         super.onStart();  
  165.         mHasStarted = true;  
  166.     }  
  167.   
  168.   
  169.     @Override  
  170.     protected void onStop() {  
  171.         // TODO Auto-generated method stub  
  172.         super.onStop();  
  173.         mHasStarted = false;  
  174.     }  
  175.       
  176. }  



测试程序:

[java]  view plain copy
  1. private void showDialog(){  
  2.     mDialog = new CommonProgressDialog(this);  
  3.       
  4.     mDialog.setMessage("正在下载");  
  5.     mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  6.     mDialog.setOnCancelListener(new OnCancelListener() {  
  7.           
  8.         @Override  
  9.         public void onCancel(DialogInterface dialog) {  
  10.             // TODO Auto-generated method stub  
  11.             //cancel(true);  
  12.         }  
  13.     });  
  14.     mDialog.show();  
  15.       
  16.     mDialog.setMax(100*1024*1024);  
  17.     mDialog.setProgress(65*1024*1024);  
  18. }  

你可能感兴趣的:(Android)