01 public class MyProgress extends ProgressBar{
02 String text
03 Paint mPaint
04
05 public MyProgress(Context context) {
06 super(context)
07 // TODO Auto-generated constructor stub
08 System.out.println("1")
09 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
2android:id="@+id/pgsBar"
3android:max="100"
4android:layout_width="fill_parent"
5android:layout_height="wrap_content"
6style="?android:attr/progressBarStyleHorizontal"
7android:visibility="visible"
8/>
这样写后,可能会因为命名空间改变,下面属性无法用代码提示。一个简单的做法就是,先写一个正常的ProgressBar的标记,把属性写完后,再将ProgressBar替换为我们自定义的进度条的完整类名。
最后,使用方法就和普通的ProgressBar差不多了。
01 public class ProgressTest extends Activity {
02
03 private Button btn_go = null
04 private MyProgress myProgress = null
05 private Handler mHandler
06
07 /** Called when the activity is first created. */
08 @Override
09 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 = 0i <=50i++){
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 }
你可以尝试使用 CreateGraphics()方法为 ProgressBar 创建一个Graphics实例,当进度条发生更改时,如PerformStep(),你可以使用 Graphics实例为其增加进度条文字.例如 像这样
Graphics g = progressBar1.CreateGraphics()
Font mf = new System.Drawing.Font("宋体", 10)
Brush mb = System.Drawing.Brushes.White
Point mp = new System.Drawing.Point(10, 0)
this.progressBar1.Value = 1
while (this.progressBar1.Value <this.progressBar1.Maximum)
{
this.progressBar1.PerformStep()
g.DrawString(string.Format("已处理....{0}%", this.progressBar1.Value), mf, mb, mp)
System.Threading.Thread.Sleep(50)
Application.DoEvents()
}
你可以使用这段代码 在程序需要的部分
打开Microsoft Visual Studio 2010, 新建名字为【进度条】的程序。在新程序界面上放置合适的控件:包括,
日志输出文本框控件;
用于输入进度条长度的输入框;
3个进度条的控制按钮,可以分别开始、暂停或者停止进度条的进度;
添加一个timer控件。
设置timer控件属性为间隔100毫秒,启用状态为停止。
添加按钮【开始】的代码
设置进度条的最小值是0,最大值是用户输入的数值,当前进度为0;
设置timer开始运行。
添加按钮【暂停/继续】的代码
如果timer状态为启用,则停止timer;
如果timer状态为停止,则重新开始timer。
添加按钮【停止】的代码
停止timer的运行,并把进度条的当前值归零。
设置timer的代码
如果当前的进度小于进度条的长度,则自动加一。
如果当前的进度等于进度条的最大值,则停止timer的运行。
设置日志输出类
可以在文本框中输入过程日志。
生成exe文件进行测试
在进度条长度框中输入100,点击【开始】,进度条会持续前进。
点击【暂停】,进度条会停止前进,【暂停】按钮上的文字会显示为【继续】。
再点击【继续】,进度条会继续进行。
当进度条前进到最大值后,会自动停止。
点击按钮【停止】,会重启进度条
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)