Android Studio通过style和layer-list实现自定义进度条

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:maxHeightandroid: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:startColorandroid: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:bottomandroid:leftandroid:rightandroid:top分别表示下、左、右和上内间距。

4 创建自定义进度条

可以使用以上创建的stylelayer-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 自定义进度条

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/80526148