在ProgressBar上加文字----显示百分比的进度条
一般的ProgressBar都只是一个光光的条(这里说的都是水平进度条),虽然比不用进度条时给用户的感觉要好,但是如果在形像化的东西上面再加上点文字,将进度描述量化,就可以让用户更加明白当前进度是多少了。
有了需求,就可以开始实现了。
这里的原理就是继承一个ProgressBar,然后重写里面的onDraw()方法。
不多说,直接上码。(下面代码中的 package hol.test; ,import就不写了)
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 | 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) + "%" ; } } |
这样一个可以满足我们基本需求的进度条就写好了。
用的时候就可以直接在layout的XML里面加了,不过添加的写法稍微有点不同。标记名要写成这个自定义进度条的完整类名,就像下面这样。
1 2 3 4 5 6 7 8 | < 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差不多了。
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 | 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方法,所以没办法,直接把三个构造方法全重写了。如果有谁知道原因,麻烦告诉一下。
进度条上的文字信息,不一定非要百分比,可以自由发挥。比如类似 “当前个数/总数”。

作者:holmes Zhang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术