进度条的可拉伸图像源

stretchable image source for progressBar

我在 activity_main.xml 文件中创建了如下进度条:

 <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="25dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" 
        android:max="100"
        android:progress="0"
        android:progressDrawable="@drawable/myprogdraw" />

然后我在 drawable 文件夹中创建了一个 myprogdraw.xml 来控制 brogressBar 设计,如下所示:

<item android:id="@android:id/background">
    <shape>
        <gradient
            android:angle="180"
            android:centerColor="#ddd"
            android:endColor="#888"
            android:startColor="#42a" />
    </shape>
</item>
<item android:id="@android:id/progress">
    <bitmap
        android:src="@drawable/prog"
        android:tileMode="repeat" />
</item>

并为此使用下图:

但布局不尽如人意,看起来重复如下:

那么我怎样才能使位图对于 progressBar 可拉伸不可重复?

如上所示,使用的图像是 9 补丁图像,但没有任何变化。

可能正因为如此,您正在使用 bitmap 元素。

解决方案 1:

删除此文件(您确实不需要):myprogdraw.xml.
只需使用这个:prog.9.png

像这样:

android:progressDrawable="@drawable/prog"

注意9补丁文件中的双扩展

[编辑]

解决方案 2:

如果您也想保留其他渐变作为背景,请将 bitmap 元素更改为 nine-patch 一个:

<item android:id="@android:id/progress">
    <nine-patch
        android:src="@drawable/prog"
        android:dither="true"
    />
</item>

[编辑 2]

解决方案 3:

使用渐变代替 9 色块。

<item android:id="@android:id/progress">
    <shape>
        <gradient
            android:angle="180"
            android:centerColor="#fe0"
            android:endColor="#f00"
            android:startColor="#0f0" />
    </shape>
</item>

这可以通过使用剪辑元素而不是位图元素来完成,这里是图层列表的xml文件

<?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>
            <gradient
                android:angle="0"
                android:centerColor="#ddd"
                android:endColor="#999"
                android:startColor="#999" />

            <corners android:radius="5dp" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/progress" />

        <shape>
            <corners android:radius="5dp" />
        </shape>
    </item>

</layer-list>

作为快速测试,我构建了一个新的空项目,然后添加了一个进度条,并编辑文本以通过在单击新按钮时调用 setProgress 方法来使用它来控制进度条值:

结果如愿以偿,如下图:

我注意到圆角应用于背景,但没有应用于进度,这可能是另一个问题,需要另一个问题来解决,但目前还可以。