1 style
1.1 sytles.xml简介
style表示样式,Android的样式在“res/values/styles.xml”中定义。可以在Android Studio中对该文件进行编辑。以下为Android Studio自动生成的styles.xml文件的内容。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
从以上内容中可以看出,styles.xml文件中包含一个根元素<resource>,具体的每种样式是通过根元素下的自标签<style>来实现的,每个<style>中又包含多个<item>用来设置该样式的不同属性。
以上代码中,定义了一个名为“AppTheme”的样式,<style>标签的“parent”属性指定了“AppTheme”要继承的样式。“AppTheme”样式中包含了三个属性,分别是“colorPrimary”、“colorPrimaryDark”以及“colorAccent”。
1.2 创建自定义进度条的样式
在“styles.xml”中添加一个新的<style>标签,该标签标识自定义进度条的样式。
<style name="StyleProgressBarMini" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:maxHeight">50dip</item>
<item name="android:minHeight">10dip</item>
<item name="android:indeterminateOnly">false</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
<item name="android:progressDrawable">@drawable/shape_progressbar_mini</item>
</style>
以上代码中,添加了一个名为“StyleProgressBarMini”的样式,该样式继承自“@android.style/Widget.ProgressBar.Horizontal”,即水平进度条。也就是说,自定义的进度条类型为水平型。关于进度条控件的介绍请参考《Android Studio中使用进度条控件》。android:maxHeight和android:minHeight指定了进度条的最大高度和最小高度;android:indeterminateOnly表示进度条是否显示数字进度;android:progressDrawable指定了自定义进度条中显示的图像,该值为“@drawable/shape_progressbar_mini”代表了@drawable/shape_progressbar_mini.xml文件,该文件的创建和编辑在“2 layer-list”中介绍。
2 layer-list
使用Drawable资源的根元素layer-list可以将多个drawable按照顺序层叠在一起显示。使用layer-list可以自定义进度条的背景、当前进度和第二进度。
2.1 创建layer-list文件
在Android Studio项目中添加layer-list文件的方法请参见《Android Studio中创建Selector文件的方法》。唯一不同的是在“Root element:”中输入“layer-list”,在“File name”中输入“shape_progressbar_mini”,与“1.2 创建自定义进度条的样式”中提到的progressDrawable属性值相同。
图1 创建layer-list 文件
2.2 编辑layer-list文件
layer-list文件中,标签<item>表示一个drawable。添加一个drawable的代码如下
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#FFFFFF"
android:startColor="#FFFFFF" />
</shape>
</item>
其中,<item>标签下的<shape>标签用来定义集合形状,默认形状为矩形。而<shape>下的<corners>标签指定了该形状的圆角,radius属性指定了圆角的半径,半径值越大,说明角越圆;<gradient>标签指定了形状的渐变,android:angle指定了渐变的角度,0表示从上到下,90表示从左到右;android:startColor和android:endColor指定了渐变的起始颜色和结束颜色;android:centerY指定了渐变中心的相对位置,该值为0~1。以上代码定义了一个用于表示进度条背景的drawable。
接下来定义进度条的当前进度和第二进度。
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="0dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#df0024"
android:startColor="#df0024" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#de42ec"
android:startColor="#de42ec" />
</shape>
</clip>
</item>
3 shape
使用Drawable资源的根元素shape来定义进度条的边框。
3.1 创建shape文件
创建的方法与“2.1 创建layer-list文件”中提到的方法相同,只是将“Root element:”设置为shape。
3.2 编辑shape文件
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#cecece" />
<corners android:radius="90dp" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
以上代码中,android:shape属性指定了shape的形状,即矩形;<solid>标签用来设置形状的填充颜色,该标签只有一个属性android:color用来指定填充的颜色;<corners>标签用来设置圆角,属性android:radius指定了圆角的半径;标签<padding>设置内容与形状边界的内间距,android:bottom、android:left、android:right和android:top分别表示下、左、右和上内间距。
4 创建自定义进度条
可以使用以上创建的style、layer-list以及shape来自定义进度条。
<ProgressBar
android:id="@+id/pb_progressbar"
style="@style/StyleProgressBarMini"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:background="@drawable/shape_progressbar_bg"
android:max="100"
android:progress="30"
android:secondaryProgress="80"/>
其中,style属性指定了在“1 style”中定义的风格;android:background属性指定了在“3 shape”中创建的shape。
自定义进度条运行效果如图2所示。
图2 自定义进度条