進度條組件是安卓重要組件之一。當后台某個程序執行時,前台進度條動態顯示了程序執行進度的百分比。是耗時較長的程序讓用戶覺得在自己的掌控之中,提高程序的友好型。
安卓支支持幾種風格的進度條,能通過style屬性呢設置進度條風格,該屬性如下:
@android:style/Widget.ProgressBar.Horizontal 水平進度條
@android:style/Widget.ProgressBar.Inverse 普通環形進度條
@android:style/Widget.ProgressBar.Large 大環形進度條
@android:style/Widget.ProgressBar.Large.Inverse 大環形進度條
@android:style/Widget.ProgressBar.Small 小環形進度條
@android:style/Widget.ProgressBar.Small.Inverse 小環形進度條
同時,進度條在xml文件中還要如下屬性:
android:max 設置進度條最大值
android:rpogress 指定進度條已經完成的進度值
android:ProgressDrawable 指定進度條軌道的繪制形式
進度條組件有兩個最常用的方法:setProgress()設置進度條已經完成的進度;incrementProgressBy()設置進度條進度增加或減少;參數是正數時增加,負數減少;
實例操作:下面我們實現視屏進度條和環形進度條
1.新建工程,在布局中添加兩個進度條,一個為環形一個水平進度條
<ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:layout_weight="1" /> <ProgressBar android:id="@+id/progressBar2" style="?android:attr/progressBarStyleSmall" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" />
2.主活動中獲取進度條,定義一個進度變量和消息處理Handler類對象
hp = (ProgressBar)findViewById(R.id.progressBar1); cp = (ProgressBar)findViewById(R.id.progressBar2); h = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what == 0x11){ hp.setProgress(progress); }else { Toast.makeText(MainActivity.this, "耗時完成", Toast.LENGTH_SHORT).show(); } hp.setVisibility(View.GONE); cp.setVisibility(View.GONE); } };
3.通過匿名內部類實例化消息處理Handler類對象,重寫handlerMessage()方法。耗時沒有完成時更新進度,耗時完成之后出現提示
h = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 0x11){ hp.setProgress(progress); }else { Toast.makeText(MainActivity.this, "耗時完成", Toast.LENGTH_SHORT).show(); } hp.setVisibility(View.GONE); cp.setVisibility(View.GONE); } }
4.開啟線程耗時,sendMessage()發送處理消息
new Thread(new Runnable() { @Override public void run() { while(true){ progress = doWork(); Message m = new Message(); if(progress <= 100){ m.what = 0x11; h.sendMessage(m); }else { m.what = 0x10; h.sendMessage(m); break; } } } private int doWork(){ progress += Math.random()*10; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return progress; } }).start();
運行代碼,可以看到環形進度條和水平進度條更新。