ProgressBar 的使用

1 篇文章 0 订阅
1 篇文章 0 订阅

书写是为了更好地思考》Android》Widget》ProgressBar》ProgressBar的使用》


在应用中,我们常常需要一些指示性的东西,来提示我们的用户,此时app正在努力做一些操作。在这样的需求下,进度条可以使用ProgressBar

ProgressBar的使用

关键字 Keywords

进度条(ProgresssBar)可视化的指示器(Visual Indicator)次要进度(Secondary Progress)中间进度(Intermediate Progress)不确定的(indeterminate)Chrome Android   progressBar Any.Do rogreassBar

概述 Class Overview[1]

进度条(ProgresssBar) 是某些操作中的(操作)进度的可视化的指示器(Visual Indicator)。它通过一个“条(bar)”,向用户呈现操作的进度;当它向前移动的时候,应用程序可以,通过修改bar的长度,改变总进度。此外,它还有一个次要进度(Secondary Progress)可以显示在进度条上,当需要显示中间进度(Intermediate Progress) 时,次要进度很有用,如在流媒体播放的缓冲区的进度。

进度条也可以是不确定的(indeterminate)。在不确定模式下,进度条显示为一个循环动画,并且没有进度指示器。这种模式常用于应用程序使用任务的长度是未知的时候。不确定进度条可能要么是一个旋转的轮子(A spinning wheel)或者一个水平条(A horizontal bar)

使用 General Usage

在布局文件中添加一个进度条,需要使用<ProgressBar> 元素。默认情况下,进度条显示为一个旋转的轮子,即为不确定。当然,我们也可以指定进度条的显示样式。接下来,介绍调用Android预定义的ProgressBar的样式的使用和用户自定义ProgressBar的样式的使用。

Android预定义ProgressBar的样式

首先,让我们看看Android给我们预先定义好了ProgressBar的哪些样式。

  1. @android:style/Widget.ProgressBar

默认的ProgressBar的样式,是一个中等大小的圆形进度条。

  1. Widget.ProgressBar.Small

偏小的ProgressBar的样式,是一个相对较小的圆形进度条。

  1. Widget.ProgressBar.Large

        偏大的ProgressBar的样式,是一个相对较大的圆形进度条。

  1. Widget.ProgressBar.Inverse

        反选的ProgressBar的样式,是一个中等大小的圆形进度条。

“反选的”(Inverse)样式是,在浅颜色的主题(light color theme,即白色背景),提供一种“相反”颜色的进度条。

  1. Widget.ProgressBar.Small.Inverse

        偏小的、反选的ProgressBar的样式,是一个相对较小的圆形进度条。

  1. Widget.ProgressBar.Large.Inverse

        偏大的、反选的ProgressBar的样式,是一个相对较大的圆形进度条。

  1. Widget.ProgressBar.Horizontal

        水平的ProgressBar的样式,是一个水平的进度条。

  1. ?android:attr/progressBarStyleSmallTitle         

偏小的ProgressBar的样式,是一个相对较小的圆形进度条,且在标题栏中显示。

然后,让我们看看如何在Layout布局文件中引入ProgressBar。

<ProgressBar
     style="@android:style/Widget.ProgressBar.Horizontal"
     style="?android:attr/progressBarStyleHorizontal"
     ... />

用户自定义ProgressBar的样式

在我们要实现自定义样式之前,让我们先来了解一下ProgressBar的XML文件中常用属性。

 Attribute NameDescription
 android:animationResolution动画帧与帧之间的时间间隔(毫秒为单位)
android:indeterminate是否开启不确定模式( the indeterminate mode)
 android:indeterminateBehavior   

在不确定模式下,当达到进度的最大值时,该属性规定了该如何变化。该属性对于两个值:repeat 和 cyclic。

repeat :动画将从0开始;(default)

cyclic:动画将从最大值回到0。

 android:indeterminateDrawable在不确定模式下使用的drawable
 android:indeterminateDuration不确定模式持续的时间
 android:indeterminateOnly限制为不确定模式,控制进度不起作用。
 android:interpolator
 android:max进度可以到达的最大值,如标题栏进度条最大值为1000。
 android:maxHeight规定进度条的最大高度的尺寸值
 android:maxWidth规定进度条的最大宽度的尺寸值
 android:minHeight规定进度条的最小高度的尺寸值
 android:minWidth规定进度条的最小宽度的尺寸值
 android:progress定义进度的初始值,[0, max]
 android:secondaryProgress定义次进度的初始值,[0, max]
 android:progressDrawableDrawable used for the progress mode.

(其中,标记为“*”的为我们实现自定义视图需要指定的)

接下来,让我们看一下Widget.ProgressBar.Small的样式[2]

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

其中@android:drawable/progress_small_white为显示的图像,剩下的四个Item是定义不确定进度条的显示的大小,这个我们不应该自己来定义,否则会导致不一致问题。由此, 在我们定义自己ProgressBar的样式的时候,可以将适度大小的ProgressBar作为Parentstyle。

<style name="MyProgressBar.Small" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress_small_green</item>

示例Demo

接下来,通过一些代码片段,来进一步加深对ProgressBar的理解。

标题栏进度条ProgressBar In Title Bar[3]

在标题栏中,可以在ActionBar上显示一个不确定进度条或者一个水平进度条。下面是显示两个进度条的代码片段。其中涉及进度条更新(进度、隐藏/显示),均必须在UI线程中执行。

显示不确定进度条

需要在Window中注册Intermediate Progress Bar,并且注册必须在setContentView调用之前。

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_view_layout);
动态的显示或者隐藏Intermediate ProgressBar。
setProgressBarIndeterminateVisibility(true|false);

水平进度条

必须在setContentView之前调用。

requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_view_layout);
设置进度的长度,0 <= progress <= 10000.
setProgress(int progress)
设置次要进度的长度,0 <= secondaryProgress <= 10000.
setSecondaryProgress(int secondaryProgress)

实时进度 Running Progress[4]

如果想要通过ProgressBar来显示一个真正的进度,必须使用水平条。在操控水平的进度条时,

如果想要在当前的进度上,增加一些进度,可以调用

public synchronized final void incrementProgressBy(int diff),或者
public synchronized void setProgress(int progress) 来改变主进度;调用
public synchronized final void incrementSecondaryProgressBy(int diff),或者
public synchronized void setSecondaryProgress(int secondaryProgress)
来改变次要进度。其中,diff 为偏移量,progress 和 secondaryProgress为具体的进度。

ProgressDialog 中显示进度条[5]

ProgressDialog是AlertDialog的一个子类,她在AlertDialog的基础上(能以弹出窗的形式显示),整合了ProgressBar的特性,拥有一个进度指示器(progress indicator),和一个可选的文本信息(text message)或者视图(view),要求文本信息和视图不能同时存在。进度范围[0,10000]。功能很强大的一个控件,有需要可以研究source code

AppWidgetProvider 中显示进度条[6]

Brain Power

当我们在实现类似Android Chrome的进度条(在ActionBar之下,当内容加载时显示) 和 Any.Do的进度条(在ActionBar之上,当更新内容时显示),我们需要用到的是自定义的ActionBar,在形如custome_action_bar_layout.xml 文件中,声明我们需要的进度条的样式。个人比较喜欢他们Android Holo 的样式,在我们的styles中可以插入如下代码

     <style name="CustomeProgressBarHorizontalHoloDark" parent="@android:style/Widget.ProgressBar.Horizontal">
        <item name="android:progressDrawable">@drawable/progress_horizontal_holo_dark</item>
        <item name="android:max">100</item>
        <item name="android:minHeight">5dip</item>
        <item name="android:maxHeight">5dip</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="CustomeProgressBarHorizontalHoloLight" parent="@android:style/Widget.ProgressBar.Horizontal">
        <item name="android:progressDrawable">@drawable/progress_horizontal_holo_light</item>
        <item name="android:max">100</item>
        <item name="android:minHeight">5dip</item>
        <item name="android:maxHeight">5dip</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

其中holo_dark的drawable为:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@android:id/background"
        android:drawable="@drawable/progress_bg_holo_dark"/>
    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="@drawable/progress_horizontal_holo_dark"
            android:scaleWidth="100%" />
    </item>
    <item android:id="@android:id/progress">
        <scale
            android:drawable="@drawable/progress_primary_holo_dark"
            android:scaleWidth="100%" />
    </item>
</layer-list>
以上用到的资源,都可以从android资源中找到




[1] 该部分内容参考自developer.android

[2] 参考自Android JellyBean’s Style

[3] 具体的代码示例参考ApidDemon ProgressBar1 & ProgrgressBar4

[4] 具体的代码示例参考ApidDemon ProgressBar1

[5] 详情参看developer.android.ProgressDialog,具体的代码示例参考ApidDemon ProgressBar3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值