一般的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方法,所以没办法,直接把三个构造方法全重写了。如果有谁知道原因,麻烦告诉一下。
进度条上的文字信息,不一定非要百分比,可以自由发挥。比如类似 “当前个数/总数”。
