Android进度条控件详解及应用

一、ProgressBar控件介绍

ProgressBar是Android中常用的控件之一,用于展示进度,可以是不确定的进度条(即循环旋转),也可以是确定的进度条(即显示百分比)。它可以用在下载、安装、上传等场景下,可以提供进度反馈,提高用户体验。

ProgressBar控件可以通过android:indeterminate属性控制其类型,true表示不确定进度,false表示确定进度(有进度值和进度条)。

下面是ProgressBar的使用示例,其中indeterminate属性设置为”true”,表示不确定进度:

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true" />

如果设置indeterminate属性为”false”,则ProgressBar就是确定进度条,下面是一个带有百分比文字显示的示例:

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:progressDrawable="@drawable/progress_bar"
        android:indeterminate="false"
        style="?android:attr/progressBarStyleHorizontal" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

其中,progressDrawable属性指定了一个Drawable资源,用来定义进度条的样式。progressBarStyleHorizontal属性继承自android:progressBarStyle,表示水平方向的进度条样式。

二、自定义ProgressBar的样式

ProgressBar的默认样式可能与应用的UI风格不匹配,可以通过自定义样式来实现与应用的统一风格。

自定义ProgressBar样式,需要使用到progressDrawable资源,它可以是一个层级Drawable或者一个XML文件。层级Drawable是一组Drawable通过layer-list标签组合在一起,可以实现层次的效果,XML文件则可以使用不同的标签来定义颜色、大小和形状等属性。

下面是一个自定义进度条样式的示例,使用的是layer-list标签实现:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape
                android:shape="rectangle">
                <stroke
                    android:width="1dp"
                    android:color="#000000" />
                </shape>
        </item>
        <item
            android:id="@android:id/progress">
            <clip>
                <shape
                    android:shape="rectangle">
                    <solid android:color="#0000ff" />
                </shape>
            </clip>
        </item>
    </layer-list>

以上的代码定义了一个矩形进度条,进度条包括两个部分:边框和进度条。其中item标签是用来定义Drawable的,第一个item定义了矩形的边框,stroke属性用来控制边框的宽度和颜色,第二个item则是通过clip标签剪切了矩形形状,然后填充了指定颜色的矩形,进而形成了一个进度条。

三、ProgressBar控件的常见应用场景

1、下载进度条

在App中,下载是一个常见的操作,需要展现下载进度。可以使用ProgressBar控件来展示下载情况,一般情况下需要实现”进度显示”和”进度更新”两个功能。

    // 在onCreate()方法中,初始化ProgressDialog控件并设置样式
    mProgressDialog = new ProgressDialog(MainActivity.this);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mProgressDialog.setCancelable(false);
    mProgressDialog.show();

    // 模拟下载任务
    new Thread(new Runnable() {
        @Override
        public void run() {
            for(int progress = 0; progress <= 100; progress++) {
                try {
                    Thread.sleep(50);
                    Message msg = mHandler.obtainMessage();
                    msg.obj = progress;
                    mHandler.sendMessage(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            mProgressDialog.dismiss();
        }
    }).start();

    // 在主线程中更新进度条的进度
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            int progress = (int) msg.obj;
            mProgressDialog.setProgress(progress);
        }
    };

以上代码中,ProgressDialog是ProgressBar的一个子类,它默认提供一个带有“进度”、“最大值”和“最小值”的滑动进度条。通过调用setProgressStyle()方法可以设置进度条的类型;setCancelable()方法可以设置点击进度条外部是否取消进度条的操作;show()方法用于显示进度条;dismiss()方法用于隐藏进度条。

2、加载进度条

加载进度条是一种特殊的ProgressBar,一般用来展示应用正在加载数据或者从网络上获取数据时,显示等待时间。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_centerInParent="true"
            android:indeterminateDrawable="@drawable/progress_dialog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/tv_loading_text"
            android:text="加载中..."
            android:textSize="20sp"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/progressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>

在以上代码中,ProgressBar的indeterminateDrawable属性指定了一个progress_dialog.xml文件作为加载进度条的样式,该XML文件可以使用layer-list标签定制特殊的样式。TextView用于展示加载进度条下方的文字。

3、上传进度条

与下载进度条类似,上传进度条也需要实现”进度显示”和”进度更新”两个功能。由于进度显示上有一些差异,上传进度条可以在附加一个进度动画特效,以提高用户体验。

    // 定义带有进度特效的Drawable样式,保存为R.drawable.upload_progress_anim
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@drawable/upload_progress_1" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_2" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_3" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_4" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_5" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_6" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_7" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_8" android:duration="60" />
    </animation-list>

    // 初始化ProgressBar控件并设置样式
    mProgressBar.setIndeterminateDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.upload_progress_anim));

    // 模拟上传任务
    new Thread(new Runnable() {
        @Override
        public void run() {
            for(int progress = 0; progress <= 100; progress++) {
                try {
                    Thread.sleep(50);
                    Message msg = mHandler.obtainMessage();
                    msg.obj = progress;
                    mHandler.sendMessage(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            mProgressBar.setIndeterminate(false);
        }
    }).start();

    // 在主线程中更新进度条的进度
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            int progress = (int) msg.obj;
            mProgressBar.setProgress(progress);
        }
    };

在以上代码中,ProgressBar的indeterminateDrawable属性设置了加载进度条的样式,该样式使用animation-list标签定义了一个带有进度效果的Drawable资源。checkAnim属性控制该Drawable循环播放,直到进度完成;在上传任务结束时,将indeterminate属性设置为false可以结束进度的播放。

总结

本文详细讲解了Android中的ProgressBar控件,介绍了ProgressBar的分类、自定义样式和实际应用场景。要点包括:ProgressBar的使用方法、属性和样式;ProgressBar在下载、加载、上传三个场景中的应用方法。读完本文,相信你已经掌握了ProgressBar的使用方法,可以在实际开发中熟练使用该控件了。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/280783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-21 13:04
下一篇 2024-12-21 13:04

相关推荐

  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python ttk控件用法介绍

    本文将从多个方面对Python ttk控件进行详细阐述,旨在帮助开发者更好的使用和理解这一控件。 一、ttk控件概述 ttk控件是Python tkinter模块中的一个扩展模块,…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27
  • Android Java Utils 可以如何提高你的开发效率

    Android Java Utils 是一款提供了一系列方便实用的工具类的 Java 库,可以帮助开发者更加高效地进行 Android 开发,提高开发效率。本文将从以下几个方面对 …

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论