进度条分为不断滚动的小圆圈,和长条状的进度条
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="448dp"
android:max="100"
android:progress="47"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
我们按照上述代码,可以实现一个水平的进度条,我们也可以通过max参数来控制进度条的最大值,通过progress参数控制进度条的初始值。
同时我们也可以通过下面这条java语句控制进度条的增减,在我们获取进度条对象以后。
progressBar.incrementProgressBy(10);
参数为正数时进度条增加,参数为负数时进度条减少。
我们实现一下点击按钮之后,过五秒钟进度条消失。
这里涉及到删除组件的情况,我们不能在主线程之外删除组件,但是如果不设置多线程,五秒钟会造成线程阻塞,导致程序意外退出。这里我们采取了view.post()方法来实现。
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="116dp"
app:layout_constraintBottom_toTopOf="@+id/progressBar2"
app:layout_constraintEnd_toEndOf="@+id/progressBar2"
app:layout_constraintStart_toStartOf="@+id/progressBar2"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="134dp"
android:layout_marginRight="134dp"
android:layout_marginBottom="63dp"
android:text="Button"
android:onClick="test"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
public void test(final View view){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
view.post(new Runnable() {
@Override
public void run() {
ViewGroup group = (ViewGroup) progressBar2.getParent();
group.removeView(progressBar2);
}
});
}
}).start();
}
当然我们也可以用handler消息队列处理器来达到同样的效果
我们将刚才新建的长条型的进度条删除
private ProgressBar progressBar ;
private ProgressBar progressBar2 ;
private Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar =findViewById(R.id.progressBar2);
progressBar2 =findViewById(R.id.progressBar);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
//在这里更新ui组件
ViewGroup group = (ViewGroup) progressBar.getParent();
group.removeView(progressBar);
//显示一句话
TextView textView =new TextView(MainActivity.this);
textView.setText("handler删除组件");
group.addView(textView);
}
});
}
}).start();
}
我们还可以再进行扩展,运行程序时让进度条自增,然后到最后自动删除,并且提示信息!
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
//在这里更新ui组件
if (progressBar.getProgress() == progressBar.getMax()) {
ViewGroup group = (ViewGroup) progressBar.getParent();
if (group != null) {
group.removeView(progressBar);
//显示一句话
TextView textView = new TextView(MainActivity.this);
textView.setText("handler删除组件");
group.addView(textView);
}
flag = false;
}
progressBar.incrementProgressBy(10);
}
});
}
}
}).start();
}
这样写代码显得难以读取,我们还可以应用handler中的Callback()方法,就能实现更新组件和其他操作分离,和上面的代码相比,更加有条理,也更加便于修改。
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBar2;
private boolean flag = true;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull final Message msg) {
//关于ui线程的代码放到这里
final ProgressBar progressBar= (ProgressBar) msg.obj;
handler.post(new Runnable() {
@Override
public void run() {
//在这里更新ui组件
if (progressBar.getProgress() == progressBar.getMax()) {
ViewGroup group = (ViewGroup) progressBar.getParent();
if (group != null) {
group.removeView(progressBar);
//显示一句话
TextView textView = new TextView(MainActivity.this);
textView.setText("handler删除组件");
group.addView(textView);
}
flag = false;
}
progressBar.incrementProgressBy(10);
}
});
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ProgressBar progressBar = findViewById(R.id.progressBar2);
progressBar2 = findViewById(R.id.progressBar);
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg= new Message();
msg.obj=progressBar;
handler.sendMessage(msg);
}
}
}).start();
}
public void test(final View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
view.post(new Runnable() {
@Override
public void run() {
ViewGroup group = (ViewGroup) progressBar2.getParent();
group.removeView(progressBar2);
}
});
}
}).start();
}
}
message就相当于是一个传输信息的载体,它里面预留了arg1、arg2等可以存放数字,obj可以存放我们要传递的对象。
例如我们将arg1赋值为1,并且表示下载成功,我们只需在读取时判断。
当我们想传输的对象比较多的时候,我们还可以定义Bundle对象
Bundle bundle =msg.getData();
bundle.putInt();//还有很多put方法可选择
这个bundle相当于一个map但是里面的key是String类型的。
以上就是进度条的制作方法,以及进度条后续的处理过程。
参考自:尚学堂课