- 概述
在处理一个比较耗时的事件时,往往界面上都需要有一个等待过程,无论是window的启动或者是QQ的登陆,以及文件的下载等等。通常进度条就会在上述场景中出现,特别是文件的下载。利用前台显示进度条使得用户不会感觉程序在后台处理中失去相应。反而提高了用户界面的友好性。本节实现一个 模拟文件下载的进度条 - 预备知识:
ProgressBar组件是android系统内置的组件,其有多种风格, 如下表所示
属性值 | 说明 |
Horizontal | 水平进度条 |
Small | 小进度条 |
Large | 大进度条 |
Inverse | 不断跳跃、旋转动画进度条 |
Large.Inverse | 不断跳跃、旋转动画的大进度条 |
Small.Inverse | 不断跳跃、旋转动画的小进度条 |
在上述风格中仅有 Horizontal 支持进度递增 ProgressBar 常用常用属性及使用说明
属性 | 说明 |
max | 最大值 |
Progress | 第一进度值 |
SecondaryProgress | 第二进度值 |
Visibility | 是否显示,默认显示 |
上述属性可以通过如下方法进行设置和获取
方法 | 说明 |
int getMax() | 获取最大值 |
Int getProgress() | 获取当前第一进度 |
int getSecondaryProgress | 获取当前第二进度 |
void setMax(int max) | 设置最大值 |
void setProgress(int progress) | 设置第一进度值 |
void setSecondaryProgress(int secondaryProgress) | 设置第二进度值 |
void setVisibility(int v) | 设置是否显示,默认显示 |
在此案例中要使用到Handler 和 Message 此处不做详细介绍
- 步骤
- 创建Model
- 在Layout文件中添加 ProgressBar组件 代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ProgressBar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linear1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/sizeView"
android:text="文件大小:"
android:textSize="20sp"
/>
<EditText
android:id="@+id/inputEdit"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:inputType="number"
android:textSize="20sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:text="MB"
android:textSize="20sp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/linear2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"
>
<ProgressBar
android:id="@+id/progressbar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="255dp"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:visibility="visible"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:text="进度"
android:textSize="12sp"
android:id="@+id/persentView"
/>
</LinearLayout>
<Button
android:id="@+id/downBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载"
android:textSize="20sp"
/>
</LinearLayout>
</RelativeLayout>
3.activity中添加如下代码
private android.widget.ProgressBar pb;
private EditText inputEd;//文件大小录入框
private Button downbtn;//开始下载按钮
private TextView showView;//
private int progressValue = 0;//设定初始值
private String s;
private int size;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar);
pb = (android.widget.ProgressBar) findViewById(R.id.progressbar1);
inputEd = (EditText) findViewById(R.id.inputEdit);
showView = (TextView) findViewById(R.id.persentView);
downbtn = (Button) findViewById(R.id.downBtn);
downbtn.setOnClickListener(new BtnListener());
}
//内部类 按钮按下触发的事件
class BtnListener implements View.OnClickListener{
@Override
public void onClick(View v) {
s = inputEd.getText().toString();//获取文本框中输入的值
size = Integer.parseInt(s);//convert为数值
pb.setMax(size);//设定进度条最大数量
Toast.makeText(ProgressBar.this,"43",Toast.LENGTH_SHORT).show();
Thread thread = new Thread(myRun);//调用ui线程
thread.start();
}
}
Runnable myRun = new Runnable() {
@Override
public void run() {
while(true){
//获取主线程Handler的Message
Message msg = handler.obtainMessage();
//进度条值作为消息的参数进行封装,进度+ 1
msg.arg1 = progressValue ++;
//将此消息发送给主线程 handel
handler.sendMessage(msg);
if(progressValue > size){//如果刺客的progressvalue 大于 文件值 即可退出
break;
}
try {
Thread.sleep(100); //休眠一次
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
android.os.Handler handler = new android.os.Handler(new android.os.Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
pb.setProgress(msg.arg1);//接收另一个线程的Message,参数arg1代表了进度
showView.setText((int)(msg.arg1 * 1.0 / size * 100) + "%");//设置显示的进度
pb.setSecondaryProgress(msg.arg1 + 10);//设置第二进度
return false;
}
});
启动程序之后在文本框中输入一个文件的大小点击下载,模拟文件下载进度
运行结果: