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


源码下载

一般的ProgressBar都只是一个光光的条(这里说的都是水平进度条),虽然比不用进度条时给用户的感觉要好,但是如果在形像化的东西上面再加上点文字,将进度描述量化,就可以让用户更加明白当前进度是多少了。

  有了需求,就可以开始实现了。

  这里的原理就是继承一个ProgressBar,然后重写里面的onDraw()方法。

  不多说,直接上码。(下面代码中的 package hol.test; import就不写了)

  public class MyProgress extends ProgressBar{
        String text;
        Paint mPaint;
         
        public MyProgress(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            System.out.println("1");
            initText();
        }
         
        public MyProgress(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
            System.out.println("2");
            initText();
        }
     
     
        public MyProgress(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
            System.out.println("3");
            initText();
        }
         
        @Override
        public synchronized void setProgress(int progress) {
            // TODO Auto-generated method stub
            setText(progress);
            super.setProgress(progress);
             
        }
     
        @Override
        protected synchronized void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            //this.setText();
            Rect rect = new Rect();
            this.mPaint.getTextBounds(this.text, 0, this.text.length(), rect);
            int x = (getWidth() / 2) - rect.centerX(); 
            int y = (getHeight() / 2) - rect.centerY(); 
            canvas.drawText(this.text, x, y, this.mPaint); 
        }
         
        //初始化,画笔
        private void initText(){
            this.mPaint = new Paint();
            this.mPaint.setColor(Color.WHITE);
             
        }
         
        private void setText(){
            setText(this.getProgress());
        }
         
        //设置文字内容
        private void setText(int progress){
            int i = (progress * 100)/this.getMax();
            this.text = String.valueOf(i) + "%";
        }
         
         
}

这样一个可以满足我们基本需求的进度条就写好了。

  用的时候就可以直接在layoutXML里面加了,不过添加的写法稍微有点不同。标记名要写成这个自定义进度条的完整类名,就像下面这样。

<hol.test.MyProgress
       android:id="@+id/pgsBar"
       android:max="100"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       style="?android:attr/progressBarStyleHorizontal"
       android:visibility="visible"
       />

这样写后,可能会因为命名空间改变,下面属性无法用代码提示。一个简单的做法就是,先写一个正常的 ProgressBar 的标记,把属性写完后,再将 ProgressBar 替换为我们自定义的进度条的完整类名。

  最后,使用方法就和普通的ProgressBar差不多了。

public class ProgressTest extends Activity {
     
    private Button btn_go = null;
    private MyProgress myProgress = null;
    private Handler mHandler;
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findView();
        setParam();
        addListener();
         
        mHandler =  new Handler(new Callback() {
             
            @Override
            public boolean handleMessage(Message msg) {
                // TODO Auto-generated method stub
                myProgress.setProgress(msg.what);
                return false;
            }
        });
         
    }
     
    private void findView(){
        btn_go = (Button) findViewById(R.id.btn_go);
        myProgress = (MyProgress) findViewById(R.id.pgsBar);
    }
     
    private void setParam(){
        btn_go.setText("开始");
    }
    private void addListener(){
        btn_go.setOnClickListener(new OnClickListener() {
             
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for(int i = 0;i <=50; i++){
                            mHandler.sendEmptyMessage(i * 2);
                            try {
                                Thread.sleep(80);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        });
    }
}

PS:刚开始本以为进度条的构造方法只需要重写那个最长参数的,也就是那个构造方法3,实际上我测试的时候基本都是运行的3方法。但有一次出错了,最后才找到系统居然用的1方法,所以没办法,直接把三个构造方法全重写了。如果有谁知道原因,麻烦告诉一下。

进度条上的文字信息,不一定非要百分比,可以自由发挥。比如类似  “当前个数/总数”。


来自博客园:http://www.cnblogs.com/3dant/archive/2011/04/25/2026776.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值