首页 > 代码库 > Android下如何自定义ProgressBar的外观
Android下如何自定义ProgressBar的外观
在Android应用中经常会用的到一些进度条,这些进度条的样子千差万别,但是大多都是由ProgressBar来的。但是Android系统自带的进度条样式却不太好看,今天要做的就是自定义一个好看的ProgressBar。
我们先来看看Android自带的进度条的样子:
我们今天的目标,自定义 的进度条的样子:
不难发现差距还是挺大的,好了,废话不多说,进入正题:
我们首先还是从源码入手,我们可以打开ADT目录下的sdk\platforms\android-16\data\res\values文件夹,由于很多Android下组件的样式(Style)都是定义在这个文件夹下的styles.xml文件中的,系统默认的ProgressBar也不例外,所以我们可以打开这里的styles.xml文件,并且找到ProgressBar的定义的地方:
由于今天需要一个横向的进度条,所以我们找到ProgressBar.Horizontal:
<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> </style>
在这里面,实际上我们需要重点关注一下progress_horizontal这个文件,我们可以在找到这个sdk\platforms\android-16\data\res\drawable文件夹下找到progress_horizontal.xml:
<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,分别是:background、secondaryProgress和progress,这里的background就是进度条所使用的背景,对应于我们上面那副自定义进度条的图就是灰色的部分,填充在进度条的底部;而progress则是进度条的样子,对应于我们上面图示的绿色的进度条的部分;secondaryProgress在我们的图示里面没有,这个组件的作用是类似于在网上看在线视频的时候,缓冲进度显示的那个灰色的进度条,跟观看进度是两个不同的进度,在这里我们没有加。
进一步观察每一个item的定义方式,Android系统是直接指定了每一个item的颜色这种方法来定义样子的,在我们这里可以使用不同的背景图片来定义会更加漂亮一些。
至此,源码部分基本搞定,下面我们需要做的就是三步:
1、在我们自己的工程目录的res/values/styles.xml文件中添加一个style条目,名字自定,比如我们这里叫my_pb_style,但是需要指定一个父类也就是在上面我们打开的Android系统中的ProgressBar的样式,同时我们需要重写父类中设置progress_horizontal的地方,将这个xml文件改为我们自己工程中自定义的xml文件,比如说叫my_progressbar.xml
<style name="my_pb_style" parent="@android:style/Widget.ProgressBar.Horizontal"> <item name="android:progressDrawable">@drawable/progressbarcolor</item> </style>
2、在我们工程目录下的res目录下,新建一个drawable的文件夹,在其中建立一个my_progressbar.xml的文件,将上面打开的progress_horizontal.xml文件中的secondaryProgress的item去掉,只保留background和progress即可,然后每个item的shape部分也去掉,改为我们自己准备好的图片,如下,其中security_progress_bg和security_progress分别为我们事先准备好的放在drawble目录下的图片,比如我们这里的图片如下:
<?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/security_progress_bg"/> <item android:id="@android:id/progress" android:drawable="@drawable/security_progress"/> </layer-list>
3、在我们需要ProgressBar的布局文件中定义出ProgressBar,并将上面我们定义好的Style样式添加进去即可:
<ProgressBar android:id="@+id/progressBar1" style="@style/my_pb_style" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" />
至此,我们就可以在文件中来使用这个自定义外观的ProgressBar了。
Android下如何自定义ProgressBar的外观