关于ProgressBar的美化问题
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的美化问题的更多相关文章
- 玩转Android之Drawable的使用
Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用. 1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候 ...
- C# winform 界面美化技巧(扁平化设计)
关于C#界面美化的一些小技巧 在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化 首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winf ...
- android学习ProgressBar的简单使用
android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...
- Winform 美化
首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件. 将主窗体FormBorderStyle更改为None,这样就得到了 ...
- QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL
QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1 C语言程序设计高级实用速成课程 基础+进阶+自学 课程2 C语言程序设计Windows GDI图形绘 ...
- Linux 桌面美化那点事儿
各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...
- Django admin美化插件suit应用[原创]
前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...
- 网站美化常见CSS
伴随网络时代日新月异的发展,用户不仅仅满足于软件系统的功能需求,对软件系统的页面显示效果以及交互模式的要求也逐渐提高.尤其是展示性质的平台页面对于界面美化效果要求更高,有一句话说的好:Html是结构, ...
- console 输出信息美化
不久前在一些前端的网站上看到的效果,以前觉得console只是拿来做做调试,不过现在看到别人网站的console美化效果,这个还可以作为一种网站个性来显示的.. 以%c开头,后面的文字就打印的信息,后 ...
随机推荐
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
- BZOJ_1005_ [HNOI2008]_明明的烦恼_(组合数学+purfer_sequence+高精度+分解因数+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1005 一棵树有n个点,给出没给节点的度,如果没有限制则为-1,求共有多少种可能的树. 分析 蒟 ...
- javascript中的 && 与 || 的运用
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a a || b : 将a, b转换为Boolean类型, 再执行逻辑或, tr ...
- Java开发心得
1. Spring概述 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J ...
- 谈谈分布式事务之三: System.Transactions事务详解[下篇]
在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法.该方法对用于创建基于现有Transaction对 象的“依赖事务(DependentTra ...
- curl 使用简介
Libcurl使用介绍: 四个关键函数: 1. curl_easy_init() 初始化curl环境,新建curl对象,返回对象句柄,使用举例: CURL *handler = cur ...
- Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法
长度窗口实现原理图 说明: 上图长度窗口为5,事件W1至W5进入引擎后属于NewEvents队列,事件W6进入引擎后,W2至W6就属于NewEvents队列,而事件W1就属于OldEvents队列了. ...
- HW5.15
public class Solution { public static void main(String[] args) { System.out.printf("%10s\t%10s\ ...
- NULL指针 Void* 和野指针
在C和C++的语言中常常有这几个概念: NULL指针.空指针.Void *指针.野指针(Wild Pointer)甚至垂悬指针(Dangling Pointer). 1.NULL指针,一般用于指向一个 ...
- 通过分析 JDK 源代码研究 Hash 存储机制
通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元 ...