6

我正在尝试在 xml 中自定义一个不确定的进度条,但我找不到一种方法来调整边缘。我从 SDK 资源中找到了默认的 xml 可绘制对象,但它们只是引用了 PNG,没有提及形状。

这是 SDK 资源中的默认 xml:

<?xml version="1.0" encoding="utf-8"?>
<animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
    <item android:drawable="@drawable/progressbar_indeterminate1" android:duration="200" />
    <item android:drawable="@drawable/progressbar_indeterminate2" android:duration="200" />
    <item android:drawable="@drawable/progressbar_indeterminate3" android:duration="200" />
</animation-list>

progressbar_indeterminate1, 2 和 3 只是方形 PNG,但它总是显示带有圆形边缘的进度条。

我尝试创建一个形状并将PNG用作背景:

<animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">

   <item
        android:drawable="@drawable/progressbar_indeterminate1"
        android:duration="200">
        <shape>
            <corners android:radius="0dp" />
        </shape>
    </item>

</animation-list>

但它不会改变形状。我会发布图片,但我还没有足够的声誉。我错过了什么?谢谢你的帮助。

4

3 回答 3

12

我刚刚遇到了同样的问题,似乎使用 XML 设置的不确定可绘制对象具有圆角。如果您需要方形(或可能任何其他)边缘,那么您需要使用代码设置不确定的可绘制对象

// line below is needed to have sharp corners in the indeterminate drawable,
// ProgressBar when parsing indeterminate drawable from XML sets rounded corners.
progressBar.setIndeterminateDrawable(context.getResources().getDrawable(R.drawable.progressbar_indeterminate));

然后是我使用的 progressbar_indeterminate 示例:

<?xml version="1.0" encoding="UTF-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
 <item android:drawable="@drawable/progress_2b" android:duration="100" />
 <item android:drawable="@drawable/progress_1b" android:duration="100" />
</animation-list>

我需要重复图像,所以我创建了progress_1b(和2b),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/progress_1"
    android:tileMode="repeat" >
</bitmap>`

其中 drawable/progress_1 是我想要重复作为不确定进度条背景的真实图像。

这个解决方案对我有用。

于 2013-06-26T12:35:58.563 回答
6

这对我有用。没有PNG。只是颜色。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape>
        <corners android:radius="0dip" />
        <stroke android:width="2px" android:color="#80c4c4c4"/>
        <solid android:color="#08000000"/>
    </shape>
</item>
<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="0dip" />
            <solid android:color="#11416a"/>
        </shape>
    </clip>
</item>
</layer-list>

进度条

于 2013-05-13T21:46:23.343 回答
1

我正在寻找一个水平不确定的ProgressBar ,没有圆角,只是一遍又一遍地从左到右扫过。为此,我创建了以下可绘制对象:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="@color/app_orange"/>
            </shape>
        </clip>
    </item>

</layer-list>

这对于普通的 ProgressBar 来说效果很好,但是当我indeterminateDrawable在 ProgressBar 的布局文件中将其设置为时,我得到了正确的动画行为,但是 ProgressBar 的大小变得很小并且拒绝像我在布局中设置的那样延伸到整个页面。

在对完成这项工作感到绝望之后,我决定创建一个自定义视图并自己制作动画。为此,我使用ObjectAnimator了 API 11 中引入的。为了在 API 10(及更低版本)中使用它,我包含了NineYearOldAndroid项目中的 jar。像魅力一样工作。

最后一步是创建我的自定义视图:

public class ProgressLoad extends ProgressBar
{
    public ProgressLoad(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        ObjectAnimator animator = ObjectAnimator.ofInt(this, "progress", 0, 101);         // Need the 101 for the progress bar to show to the end.
        animator.setDuration(2000);
        animator.setRepeatCount(ObjectAnimator.INFINITE);
        animator.setRepeatMode(ObjectAnimator.RESTART);

        animator.start();
    }
}

然后我简单地将这个自定义视图包含在我的布局中:

<com.example.views.ProgressLoad
            android:id="@+id/pb_load"
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="5dp"
            android:layout_gravity="top"
            android:progressDrawable="@drawable/content_progress_bar_determinate"/>

瞧,我有一个水平矩形进度条(没有圆角),它的进度条反复扫过。当我完成它时,我只是从其父级中删除了自定义视图。

这种技术的优点是可以通过简单地更改传递给 的值来设置动画扫过的速度animator.setDuration(int value)

于 2013-11-07T16:48:48.003 回答