在ProgressBar上加文字----显示百分比的进度条

一般的ProgressBar 都只是一个光光的条(这里说的都是水平进度条),虽然比不用进度条时给用户的感觉要好,但是如果在形像化的东西上面再加上点文字,将进度描述量化,就可以让用户更加明白当前进度是多少了。
  有了需求,就可以开始实现了。
  这里的原理就是继承一个ProgressBar ,然后重写里面的onDraw() 方法。
  不多说,直接上码。(下面代码中的  package hol.test;  import 就不写了)
  1.         public class MyProgress extends ProgressBar{
  2.                 String text;
  3.                 Paint mPaint;
  4.                 
  5.                 public MyProgress(Context context) {
  6.                         super(context);
  7.                         // TODO Auto-generated constructor stub
  8.                         System.out.println("1");
  9.                         initText();        
  10.                 }
  11.                 
  12.                 public MyProgress(Context context, AttributeSet attrs, int defStyle) {
  13.                         super(context, attrs, defStyle);
  14.                         // TODO Auto-generated constructor stub
  15.                         System.out.println("2");
  16.                         initText();
  17.                 }
  18.         
  19.         
  20.                 public MyProgress(Context context, AttributeSet attrs) {
  21.                         super(context, attrs);
  22.                         // TODO Auto-generated constructor stub
  23.                         System.out.println("3");
  24.                         initText();
  25.                 }
  26.                 
  27.                 @Override
  28.                 public synchronized void setProgress(int progress) {
  29.                         // TODO Auto-generated method stub
  30.                         setText(progress);
  31.                         super.setProgress(progress);
  32.                         
  33.                 }
  34.         
  35.                 @Override
  36.                 protected synchronized void onDraw(Canvas canvas) {
  37.                         // TODO Auto-generated method stub
  38.                         super.onDraw(canvas);
  39.                         //this.setText();
  40.                         Rect rect = new Rect();
  41.                         this.mPaint.getTextBounds(this.text, 0, this.text.length(), rect);
  42.                 int x = (getWidth() / 2) - rect.centerX();  
  43.                 int y = (getHeight() / 2) - rect.centerY();  
  44.                 canvas.drawText(this.text, x, y, this.mPaint);  
  45.                 }
  46.                 
  47.                 //初始化,画笔
  48.                 private void initText(){
  49.                         this.mPaint = new Paint();
  50.                         this.mPaint.setColor(Color.WHITE);
  51.                         
  52.                 }
  53.                 
  54.                 private void setText(){
  55.                         setText(this.getProgress());
  56.                 }
  57.                 
  58.                 //设置文字内容
  59.                 private void setText(int progress){
  60.                         int i = (progress * 100)/this.getMax();
  61.                         this.text = String.valueOf(i) + "%";
  62.                 }
  63.                 
  64.                 
  65. }
复制代码
 这样一个可以满足我们基本需求的进度条就写好了。   用的时候就可以直接在 layout XML 里面加了,不过添加的写法稍微有点不同。标记名要写成这个自定义进度条的完整类名,就像下面这样。
  1. <hol.test.MyProgress 
  2.            android:id="@+id/pgsBar"
  3.            android:max="100"
  4.            android:layout_width="fill_parent"
  5.            android:layout_height="wrap_content"
  6.            style="?android:attr/progressBarStyleHorizontal"
  7.            android:visibility="visible"
  8.            />
复制代码
这样写后,可能会因为命名空间改变,下面属性无法用代码提示。一个简单的做法就是,先写一个正常的ProgressBar 的标记,把属性写完后,再将ProgressBar 替换为我们自定义的进度条的完整类名。   最后,使用方法就和普通的 ProgressBar 差不多了。
  1. public class ProgressTest extends Activity {
  2.         
  3.         private Button btn_go = null;
  4.         private MyProgress myProgress = null;
  5.         private Handler mHandler;
  6.         
  7.     /** Called when the activity is first created. */
  8.     @Override
  9.     public void onCreate(Bundle savedInstanceState) {
  10.         super.onCreate(savedInstanceState);
  11.         setContentView(R.layout.main);
  12.         findView();
  13.         setParam();
  14.         addListener();
  15.         
  16.         mHandler =  new Handler(new Callback() {
  17.                         
  18.                         @Override
  19.                         public boolean handleMessage(Message msg) {
  20.                                 // TODO Auto-generated method stub
  21.                                 myProgress.setProgress(msg.what);
  22.                                 return false;
  23.                         }
  24.                 });
  25.         
  26.     }
  27.     
  28.     private void findView(){
  29.             btn_go = (Button) findViewById(R.id.btn_go);
  30.             myProgress = (MyProgress) findViewById(R.id.pgsBar);
  31.     }
  32.     
  33.     private void setParam(){
  34.             btn_go.setText("开始");
  35.     }
  36.     private void addListener(){
  37.             btn_go.setOnClickListener(new OnClickListener() {
  38.                         
  39.                         @Override
  40.                         public void onClick(View v) {
  41.                                 // TODO Auto-generated method stub
  42.                                 new Thread(new Runnable() {        
  43.                                         @Override
  44.                                         public void run() {
  45.                                                 // TODO Auto-generated method stub
  46.                                                 for(int i = 0;i <=50; i++){
  47.                                                         mHandler.sendEmptyMessage(i * 2);
  48.                                                         try {
  49.                                                                 Thread.sleep(80);
  50.                                                         } catch (InterruptedException e) {
  51.                                                                 // TODO Auto-generated catch block
  52.                                                                 e.printStackTrace();
  53.                                                         }
  54.                                                 }
  55.                                         }
  56.                                 }).start();
  57.                         }
  58.                 });
  59.     }
  60. }
复制代码
PS :刚开始本以为进度条的构造方法只需要重写那个最长参数的,也就是那个构造方法3 ,实际上我测试的时候基本都是运行的3 方法。但有一次出错了,最后才找到系统居然用的1 方法,所以没办法,直接把三个构造方法全重写了。如果有谁知道原因,麻烦告诉一下。进度条上的文字信息,不一定非要百分比,可以自由发挥。比如类似  “当前个数/ 总数”。
如果想要在进度条末端显示百分比,可以通过自定义 ProgressBar 的绘制方式来实现。具体做法如下: 1. 在窗体上添加一个 ProgressBar 控件和一个 Label 控件,设置 ProgressBar 的 Style 属性为 ProgressBarStyle.Continuous,Label 控件用于显示进度百分比。 2. 在窗体的 Load 事件添加以下代码: ```csharp private void Form1_Load(object sender, EventArgs e) { // 设置 ProgressBar 的最大值和初始值 progressBar1.Maximum = 100; progressBar1.Value = 0; // 设置 ProgressBar 的 Style 为 Continuous progressBar1.Style = ProgressBarStyle.Continuous; } ``` 3. 重写 ProgressBar 的 Paint 方法,绘制进度条末端的百分比。代码如下: ```csharp private void progressBar1_Paint(object sender, PaintEventArgs e) { // 获取 ProgressBar 上下文 var g = e.Graphics; // 获取 ProgressBar 客户区域 var rect = progressBar1.ClientRectangle; // 计算进度条的宽度 var progressBarWidth = (int)(rect.Width * ((double)progressBar1.Value / progressBar1.Maximum)); // 绘制进度条 var progressBarRect = new Rectangle(rect.X, rect.Y, progressBarWidth, rect.Height); g.FillRectangle(Brushes.Green, progressBarRect); // 绘制进度百分比 var percent = (int)(((double)progressBar1.Value / progressBar1.Maximum) * 100); var percentText = $"{percent}%"; var textSize = g.MeasureString(percentText, progressBar1.Font); var textX = rect.X + progressBarWidth - (int)textSize.Width; var textY = rect.Y + (rect.Height - (int)textSize.Height) / 2; var textPoint = new PointF(textX, textY); g.DrawString(percentText, progressBar1.Font, Brushes.White, textPoint); } ``` 在上面的代码,我们首先获取 ProgressBar 的客户区域和当前进度条的宽度,然后绘制进度条。接着计算进度百分比并绘制在进度条末端。最后在窗体的 Load 事件将 Paint 事件和 ProgressBar 控件关联即可。 这样就可以实现在进度条末端显示百分比的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值