ProgressBar 自定义的时候可能会遇到一个问题,希望进度条中的进度的两端都是圆角的(或者进度的末端是圆角的);
如下图:
progress bar rounder
但是根据自定义的shape 或者是 layer-list却总是很难做到,几乎都是被clip成了直角的样子;
progress bar
为什么是直角的?原因就是被clip给切了,所以我们不能够用clip,而要使用scale这个标签。而上面链接给出的解答是定义一个.9的图片就能满足要求,由于我们这里是纯色的一个进度,所以没有必要通过再制作一个.9的图片,而只需要通过同样的方法引用我们定义的一个shape就可以了;
见代码:
<ProgressBar
android:layout_below="@id/text_1"
android:layout_marginTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progressbar_1"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
android:progress="40"
android:progressDrawable="@drawable/progress_bar_drawable" />
progressDrawable 引用的progress_bar_drawable:
<?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:topRightRadius="20dp"
android:bottomRightRadius="20dp" />
<solid android:color="#ED30353E"/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%">
<shape>
<corners android:topRightRadius="20dp"
android:bottomRightRadius="20dp"/>
<solid android:color="#11ce33"/>
</shape>
</scale>
</item>
<item android:id="@android:id/progress">
<!--
<clip>
<shape>
<corners android:topRightRadius="20dp"
android:bottomRightRadius="20dp"/>
<solid android:color="#FF009898"/>
</shape>
</clip>
-->
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_bar_ct" />
</item>
</layer-list>
重点就是这个:
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_bar_ct" />
指定了一个我们自定义的shape:progress_bar_ct.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- solid指定形状的填充色,只有android:color一个属性 -->
<solid android:color="#FF009898" />
<!-- padding设置内容区域离边界的间距 -->
<!-- corners设置圆角,只适用于rectangle -->
<corners android:bottomRightRadius="20dp"
android:topRightRadius="20dp"/>
</shape>
这样就不需要自定义.9的图片了;
PS:由于本人的需求是右端才是圆角,如果需要4个角都是圆角只需要修改一点代码即可;
<corners android:bottomRightRadius="20dp"
android:topRightRadius="20dp"/> ```
修改成:
<corners android:radius="20dp" />
<?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="15dp" /> <solid android:color="#ffffff" /> <size android:height="12dp" /> <stroke android:width="2dp" android:color="#c4e9ff" /> <!-- <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="15dp" /> <gradient android:angle="270" android:centerColor="#c6b7ff" android:centerY="0.75" android:endColor="#c3b2ff" android:startColor="#b9a4ff" /> <size android:height="12dp" /> </shape> </clip> </item> <!-- 第一进度条 --> <item android:id="@android:id/progress"> <scale android:scaleWidth="100%"> <shape android:shape="rectangle"> <!-- solid指定形状的填充色,只有android:color一个属性 --> <!--<solid android:color="#FF009898" />--> <gradient android:angle="45" android:centerColor="#0061dd" android:endColor="#0061dd" android:startColor="#5cacff" /> <!-- padding设置内容区域离边界的间距 --> <!-- corners设置圆角,只适用于rectangle --> <corners android:radius="15dp" /> </shape> </scale> <!--<clip>--> <!--<shape>--> <!--<corners android:radius="6dp" />--> <!--<!–<solid--> <!--android:color="@color/c_0061dd"--> <!--/>–>--> <!--<gradient--> <!--android:angle="45"--> <!--android:centerColor="#0061dd"--> <!--android:endColor="#0061dd"--> <!--android:startColor="#5cacff" />--> <!--<size android:height="12dp" />--> <!--<stroke--> <!--android:width="2dp"--> <!--android:color="@android:color/transparent" />--> <!--<!–<gradient--> <!--android:startColor="#57e8ff"--> <!--android:centerColor="#74ebff"--> <!--android:centerY="0.75"--> <!--android:endColor="#8eefff"--> <!--android:angle="270"--> <!--/>–>--> <!--</shape>--> <!--</clip>--> </item> </layer-list>