
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 }
ProgressBar 控件通过从左到右用一些方块填充矩形来表示一个较长 *** 作的进度。语法ProgressBar说明 ProgressBar 控件监视 *** 作完成的进度。 ProgressBar 控件有一个行程和一个当前位置。行程代表该 *** 作的整个持续时间。当前位置则代表应用程序在完成该 *** 作过程时的进度。Max 和 Min 属性设置了行程的界限。Value 属性则指明了在行程范围内的当前位置。由于使用方块来填充控件,因此所填充的数量只能是接近于 Value 属性的当前设置值。基于控件的大小,Value 属性决定何时显示下一个方块。ProgressBar 控件的 Height 属性和 Width 属性决定所填充控件的方块的数量和大小。方块数量越多,控件就越能精确地描述 *** 作进度。为了增加显示方块的数量,需要减少控件的 Height 或者增加其 Width。BorderStyle 属性的设置值同样影响方块的数量和大小。为了适应边框要求,方块的大小要更小一点。可以用 ProgressBar 控件的 Align 属性把它自动定位在窗体的顶部或底部。提示 缩小方块的大小直到其所表示的进度增加量与实际进度值达到最接近的匹配程度,应使 ProgressBar 控件的宽度至少是其长度的 13 倍。下面的示例说明如何用一个名为 ProgressBar1 的 ProgressBar 控件,来表示对一个大数组冗长的 *** 作进度。把一个 CommandButton 控件和一个 ProgressBar 控件放在同一窗体里。示例代码中的 Align 属性把 ProgressBar 控件定位在沿着窗体的底部。该 ProgressBar 不显示任何文本。Private Sub Command1_Click() Dim Counter As Integer Dim Workarea(250) As String ProgressBar1.Min = LBound(Workarea) ProgressBar1.Max = UBound(Workarea) ProgressBar1.Visible = True'设置进度的值为 Min。 ProgressBar1.Value = ProgressBar1.Min'在整个数组中循环。 For Counter = LBound(Workarea) To UBound(Workarea) '设置数组中每项的初始值。 Workarea(Counter) = "Initial value" &Counter ProgressBar1.Value = Counter Next Counter ProgressBar1.Visible = False ProgressBar1.Value = ProgressBar1.MinEnd SubPrivate Sub Form_Load() ProgressBar1.Align = vbAlignBottom ProgressBar1.Visible = False Command1.Caption = "Initialize array"End Sub你可以尝试使用 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()
}
你可以使用这段代码 在程序需要的部分
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)