场景
进度条效果
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
将布局改为相对布局,然后添加一个ProgressBar,并添加id属性。
然后通过
android:max="100"
设置进度条最大值
通过
android:layout_alignParentBottom="true" android:layout_marginBottom="50dp"
设置其位置在底部并设置外边距
关于进度条的样式,参考如下
这里使用的进度条样式是
style="?android:attr/progressBarStyleHorizontal"
完整xml示例代码
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ProgressBarActivity"> <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:max="100" android:layout_alignParentBottom="true" android:layout_marginBottom="50dp" android:id="@+id/progressBar" /> </RelativeLayout>
然后来到Activity
要实现进度条的简单流程如下
首先在Activity中声明进度条对象、进度值、Handler对象。
关于Hnadler对象,因为Android不支持在主线程中更新UI控件,所以提供了Handler对象。
首先通过id获取进度条对象,然后实例化Handler,需要重写其handleMessage方法
在handleMessage方法中,通过msg的标识来判断是否完成进度条的加载。
然后需要新开一个线程,在线程中随机给进度条添加进度值,然后判断是否到100,进而报告不同的进度和标识变量。
完整示例代码
package com.badao.relativelayouttest; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; import java.util.prefs.PreferenceChangeEvent; public class ProgressBarActivity extends AppCompatActivity { private ProgressBar progressBar; private int mProgress = 0; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_bar); //获取进度条控件 progressBar = (ProgressBar) findViewById(R.id.progressBar); //Android 不支持在主线程中更新UI组件 所以提供了Handler对象 mHandler = new Handler(){ //通过消息代码msg进行区分是否加载完成 @Override public void handleMessage(@NonNull Message msg) { if(msg.what ==0x111) { //给进度条赋值 progressBar.setProgress(mProgress); }else { Toast.makeText(ProgressBarActivity.this,"加载完成",Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } }; //新建一个线程 new Thread(new Runnable() { @Override public void run() { while (true) { //具体执行的方法的进度,返回进度 mProgress = doWork(); //定义一个标识,标识进度条是否加载完成 Message message = new Message(); if(mProgress <100) { //表示还没加载到100 则向进度条报告进度 message.what = 0x111; mHandler.sendMessage(message); }else { //表示此时已经加载完成,向Handler发送消息 并跳出循环 message.what =0x110; mHandler.sendMessage(message); break; } } } //具体执行 并返回进度的方法 private int doWork() { //进度条随机加进度 mProgress +=Math.random()*10; try { //进程休眠0.5秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } return mProgress; } }).start(); //启动进程 } }
博客园:
https://www.cnblogs.com/badaoliumangqizhi/
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。