2.08ProgressBar(进度条)-UI组件-Android

TOC

ProgressBar(进度条)-UI组件-Android

常用属性

属性名 说明
android:max: 进度条的最大值
android:progress: 进度条已完成进度值
android:progressDrawable: 设置轨道对应的Drawable对象
android:indeterminate: 如果设置成true,则进度条不精确显示进度
android:indeterminateDrawable: 设置不显示进度的进度条的Drawable对象
android:indeterminateDuration: 设置不精确显示进度的持续时间
android:secondaryProgress: 二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!

Java方法

方法 说明
getMax(): 返回这个进度条的范围的上限
getProgress(): 返回进度
getSecondaryProgress(): 返回次要进度
incrementProgressBy(int diff): 指定增加的进度
isIndeterminate(): 指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate): 设置不确定模式下设置ProgressBar的样式.

ProgressBar不同的样式会有不同的形状和模式:

属性名 说明
Widget.ProgressBar.Horizontal 横向进度条(精确模式或模糊模式,这取决于Android:indeterminate)。
Widget.ProgressBar 中号的圆形进度条(模糊模式)。
Widget.ProgressBar.Small 小号的圆形进度条(模糊模式)。
Widget.ProgressBar.Large 大号的圆形进度条(模糊模式)。
Widget.ProgressBar.Inverse 中号的圆形进度条(模糊模式),该样式适用于亮色背景(例如白色)。
Widget.ProgressBar.Small.Inverse 小号的圆形进度条(模糊模式),该样式适用于亮色背景(例如白色)。
Widget.ProgressBar.Large.Inverse

案例

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">

    <!-- 系统提供的圆形进度条,依次是大中小 -->

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <!-- 圆形进度-->
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <!--系统提供的水平进度条-->
    <ProgressBar
        android:id="@+id/pb"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="0" /><!--android:progress 初始进度 ,默认18-->

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:indeterminate="true" />
    <!--android:indeterminate="true" 进度不精确的显示-->

</LinearLayout>

package com.ttit.helloworld;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class ProgressBarActivity extends AppCompatActivity {
    private int currentProgress = 0;//当前进度值
    private ProgressBar progressBar;
    private int maxProgress; //最大进度值

    //处理handler传递的消息
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    progressBar.setProgress(currentProgress);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.progressbar_layout);
        //获取组件
        progressBar = findViewById(R.id.pb);
        //获取进度最大值
        maxProgress = progressBar.getMax();
    }

    /**
     * 第三个组件,不停加载进度
     */
    @Override
    protected void onStart() {
        super.onStart();
        // 启动线程模拟加载
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        for (int i = 0; i <= 100; i++) {
                            Thread.sleep(1000);//间隔1s
                            currentProgress += 10;//进度加10
                            if (currentProgress > maxProgress) {
                                break;
                            }
                            mHandler.sendEmptyMessage(0);//发送消息,子线程发送到主线程
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

样式

    <style name="Widget.ProgressBar.Small">
        <item name="indeterminateDrawable">@drawable/progress_small_white</item>
        <item name="minWidth">16dip</item>
        <item name="maxWidth">16dip</item>
        <item name="minHeight">16dip</item>
        <item name="maxHeight">16dip</item>
    </style>

    <style name="Widget.ProgressBar.Large">
        <item name="indeterminateDrawable">@drawable/progress_large_white</item>
        <item name="minWidth">76dip</item>
        <item name="maxWidth">76dip</item>
        <item name="minHeight">76dip</item>
        <item name="maxHeight">76dip</item>
    </style>

    <style name="Widget.ProgressBar.Horizontal">
        <item name="indeterminateOnly">false</item>
        <item name="progressDrawable">@drawable/progress_horizontal</item>
        <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item>
        <item name="minHeight">20dip</item>
        <item name="maxHeight">20dip</item>
        <item name="mirrorForRtl">true</item>
    </style>
原文地址:https://www.cnblogs.com/ziyue7575/p/c25a71df120ecbd6e868ae0a49fb6606.html