文/bywinkey 整理时间:2014年12月24日22:58:46
-
概述
在处理一个比较耗时的事件时,往往界面上都需要有一个等待过程,无论是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;
}
});
启动程序之后在文本框中输入一个文件的大小点击下载,模拟文件下载进度
运行结果: