Android自带的ProgressBar其实也算不上丑陋,但是如果所有的App都使用一个模式的ProgressBar,那么估计用户就要崩溃了,打开任何一个App,擦,进度条都一模一样。。有鉴于此,我们今天就来谈谈ProgressBar的美化问题。学会了ProgressBar的美化,那么SeekBar和RatingBar的美化应该就不在话下了,因为SeekBar和RatingBar都是继承自ProgressBar。OK,废话不多说,我们来进入今天的正题。

进度条Style的两种设置方式

正常情况下,我们在布局文件中添加一个进度条是这样的:

    <ProgressBar
android:id="@+id/pb1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

显示效果是这样的:

这是系统默认的情况,如果有需要,我们可以修改进度条的样式,只需添加一个属性,如下:

    <ProgressBar
android:id="@+id/pb1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

这个时候显示效果如下:

毫无疑问,进度条变大了。style属性就是我们用来设置进度条样式的,这种设置方式有好几种取值,如下:

每一种取值都代表一种样式,我就不一一去试了,大家可以自行尝试,根据Google提供给我们的资料,我们知道,给ProgressBar设置style除了这一种方式之外,还有一种方式,那就是这样:

    <ProgressBar
android:id="@+id/pb1"
style="@android:style/Widget.ProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

大家注意看取值的不同,那么这种方式的显示效果是什么样的呢?看下图:

都是转圈,但是很明显第一个看起来更舒服一些,那么这种设置方式也有好几种取值,如下:

每一种取值都代表了一种样式,大家可以自行尝试。

OK,上面是给大家简单介绍了一下Google给我们提供的两种给ProgressBar设置Style的方式,下面我们就要探究怎么样来自定义Style。

自定义水平进度条样式

进度条我们可以让它转圈圈,也可以让它水平显示,水平显示我们可以通过下面任意一行代码来让我们的进度条水平显示:

style="@android:style/Widget.ProgressBar.Horizontal"

style="?android:attr/progressBarStyleHorizontal"

只不过这两行代码显示出来的水平进度条的样式有些许差异罢了,如下图:

这是Google给我们提供的两种样式,下面我们就要看看怎样来自定义水平进度条的样式,通过自定义进度条来让我们的App与众不同。要自定义水平进度条的样式,我们首先要弄明白系统的这个样式是怎么显示出来的,我们追踪

style="@android:style/Widget.ProgressBar.Horizontal"

这行代码所指向的位置,我们看到了这样一个Style:

    <style name="Widget.ProgressBar.Horizontal">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
<item name="android:minHeight">20dip</item>
<item name="android:maxHeight">20dip</item>
<item name="android:mirrorForRtl">true</item>
</style>

在这个Style中,有一个progressDrawable属性,这个属性其实就是我们的progressBar显示的样式,我们点击去看一下:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item> <item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ffd300"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
</shape>
</clip>
</item> <item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ffffd300"
android:centerColor="#ffffb600"
android:centerY="0.75"
android:endColor="#ffffcb00"
android:angle="270"
/>
</shape>
</clip>
</item> </layer-list>

这个里边一共有三个item,这三个item就是progressBar所显示出来的三层,最底层是背景色,第二层是secondaryProgress的颜色,第三层就是我们progress的颜色,看到这些我们就明白了,原来progressBar的样式是在这里设置的,那么我们模仿Google的源码,自定义一个样式看看:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item> <item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#EE5C42"
android:centerColor="#EE5C42"
android:centerY="0.75"
android:endColor="#EE5C42"
android:angle="270"
/>
</shape>
</clip>
</item> <item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#EE0000"
android:centerColor="#EE0000"
android:centerY="0.75"
android:endColor="#EE0000"
android:angle="270"
/>
</shape>
</clip>
</item> </layer-list>

OK,我只是修改了secondaryProgress的颜色,其他的东西都没有修改,然后我再模仿Google的Style,自定义一个Style,如下:

    <style name="m_progress_bar_style">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@drawable/m_progress_horizontal</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
<item name="android:minHeight">2dip</item>
<item name="android:maxHeight">2dip</item>
<item name="android:mirrorForRtl">true</item>
</style>

OK,这里的Style,我修改了其中的三个值,分别是progressDrawable、minHeight、maxHeight,首先将progressDrawable修改为我自定义的进度条颜色,然后我考虑到这里的进度条过高,因此我把它的高度改为2dp,这个时候的显示效果如下:

progress和secondaryProgress的颜色已经被我成功修改为红色和浅红色了。如果我愿意,我也可以把剩余的灰色修改为其他颜色。事实上,我们可以省略上面一步,直接在布局文件中给progressBar添加progressDrawable属性,如下:

    <ProgressBar
android:id="@+id/pb1"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:maxHeight="2dp"
android:minHeight="2dp"
android:progress="20"
android:progressDrawable="@drawable/m_progress_horizontal"
android:secondaryProgress="40" />

这个时候显示效果和上面还是一样的。根据这个特性,我们可以实现下面这种歌词进度的效果,如图:

代码如下:

<?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/t1"/>
<item
android:id="@android:id/progress"
android:drawable="@drawable/t2"/> </layer-list>

其实就是两张图片:

OK,这里就是我们对水平进度条样式的一个简单修改,使它更符合我们的审美。

自定义圆形进度条样式

当我们不知道我们的耗时操作究竟要执行多长时间的时候,我们通常都会采用圆形进度条来显示。安卓自带的圆形进度条如第一幅图所示,但更多情况下我们见到的圆形进度条都比较好看,比如一个小人在跑等等,那么这里我们先来看一个简单的原型进度条。

和上面一样,要想自定义一个圆形进度条,我们首先得知道android默认的圆形进度条的样式是怎么显示出来的,我们追踪

style="@android:style/Widget.ProgressBar"

这一行代码的源码,如下:

    <style name="Widget.ProgressBar">
<item name="android:indeterminateOnly">true</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_medium_white</item>
<item name="android:indeterminateBehavior">repeat</item>
<item name="android:indeterminateDuration">3500</item>
<item name="android:minWidth">48dip</item>
<item name="android:maxWidth">48dip</item>
<item name="android:minHeight">48dip</item>
<item name="android:maxHeight">48dip</item>
<item name="android:mirrorForRtl">false</item>
</style>

我们看到这里有一个属性叫做indeterminateDrawable,这个属性其实决定了圆形进度条的样式,同时我们还看到indeterminateBehavior和indeterminateDuration两个属性分别用来设置小圈旋转的模式以及每一圈的旋转时间,那么看到这里我们就明白了该怎么样来修改圆形进度条的样式了吧,我们自定义一个progressbar_rotate.xml文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/loading_32dp"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="359" > </rotate>

loading_32dp是一张图片,如下:

我们让这张图片绕自身的中心点旋转,OK,progressbar_rotate.xml文件写好之后,下一步就是自定义style了,我们可以模仿Widget.ProgressBar来自定义style,也可以直接在布局文件中设置indeterminateDrawable属性,我采用第二种方式,代码如下:

    <ProgressBar
android:id="@+id/pb4"
style="@android:style/Widget.ProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/pb1"
android:layout_marginTop="20dp"
android:indeterminateDrawable="@drawable/progressbar_rotate"/>

效果图如下:

我们看到有一个圆圈在不停的转动,就这么简单,我们自定义了一个圆形进度条样式。

就是这么简单。

关于ProgressBar的美化问题的更多相关文章

  1. 玩转Android之Drawable的使用

    Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用. 1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候 ...

  2. C# winform 界面美化技巧(扁平化设计)

    关于C#界面美化的一些小技巧 在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化 首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winf ...

  3. android学习ProgressBar的简单使用

    android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...

  4. Winform 美化

    首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件. 将主窗体FormBorderStyle更改为None,这样就得到了 ...

  5. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

  6. Linux 桌面美化那点事儿

    各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...

  7. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  8. 网站美化常见CSS

    伴随网络时代日新月异的发展,用户不仅仅满足于软件系统的功能需求,对软件系统的页面显示效果以及交互模式的要求也逐渐提高.尤其是展示性质的平台页面对于界面美化效果要求更高,有一句话说的好:Html是结构, ...

  9. console 输出信息美化

    不久前在一些前端的网站上看到的效果,以前觉得console只是拿来做做调试,不过现在看到别人网站的console美化效果,这个还可以作为一种网站个性来显示的.. 以%c开头,后面的文字就打印的信息,后 ...

随机推荐

  1. xcode5编译过的xib 如何在xcode4.6下打开

    IOS7一出来,对应的xcode版本变成了5了,这次xcode升级比较大,特别是在源代码编译方面,苹果下足了功夫,编译时间不到原来的一半,忽然强烈觉得android在这方面需要加强啊: 其他不多说,X ...

  2. 【HDOJ】Power Stations

    DLX.针对每个城市,每个城市可充电的区间构成一个plan.每个决策由N*D个时间及N个精确覆盖构成. /* 3663 */ #include <iostream> #include &l ...

  3. js 获取服务器控件

    大致是HtmlControl被服务器发送到页面ID不变,比如<div id="a" runat="sever"></div> WebCo ...

  4. lightoj 1011 (状态压缩dp)

    思路:状态压缩dp,设dp[i][j] 表示前i行,状态为j时的最大值,状态定义为:若前i行中取了第x列那么j的二进制位中第x位为1,否则为0,最后答案就是dp[n-1][(1 << n) ...

  5. Jmeter初步使用三--使用jmeter自身录制脚本

    今日,小编在网上看到很多人使用badboy来录制,然后再把jmx脚本弄到Jmeter上做性能测试.这种方法在小编刚用Jmeter时也曾经用过,但是感觉太麻烦了,所以就找了下其它资料.结果,小编偶然发现 ...

  6. selenium1.0和selenium2.0页面等待处理详解

    一.selenium1.0页面等待 1.……AndWait 经常会看到, selenium action命令中很多有这种……AndWait后缀, 例如click和clickAndWait命令: cli ...

  7. 【原】 Spark中Worker源码分析(一)

    Worker作为对于Spark集群的健壮运行起着举足轻重的作用,作为Master的奴隶,每15s向Master告诉自己还活着,一旦主人(Master>有了任务(Application),立马交给 ...

  8. mysql 5.5 中的示例数据库 employees

    http://dev.mysql.com/doc/employee/en/employees-installation.html

  9. iOS真机调试——Certificates, Identifiers &Profiles 简介

    Certificates, Identifiers &Profiles 简介 每次到这个页面,我都不知道这几个选项是干啥的,我相信有很多同学跟我一样,所以首先我们就来先介绍下Developer ...

  10. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程06:技能播放的逻辑关系》

    6.技能播放的逻辑关系 技能播放概述: 当完成对技能输入与检测之后,程序就该对输入在缓存器中的按键操作与程序读取的技能表信息进行匹配,根据匹配结果播放相应的连招技能. 技能播放原理: 按键缓存器中内容 ...