更改ProgressBar.Horizo​​ntal不确定行为

时间:2017-01-23 14:06:58

标签: android android-progressbar

我尝试实现一个水平不确定的ProgressBar,它将在结束时反转其动画。为了澄清,我希望进度条从0到100动画,然后从100回到0。 这是a video of the standard animation,我想在结束时反转。

根据documentation of ProgressBar,这应该可以用xml,但我无法做到这一点。你可以设置重复(标准?)或循环(这就是我想要的)

这是我的实施:

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="8dip"
    android:indeterminate="true"
    android:indeterminateOnly="true"      //tried "false" too
    android:indeterminateBehavior="cycle" // type "reverse" is the one from linked video?
    android:max="100" />

尝试使用max-value和不同的style-parents

但是,我找到了值android:indeterminateDuration="[value]"并设置为1到1秒,另一个设置为10秒。最后,两个进度加载器都有相同的长度,这让我想到了这些样式可能会在某处覆盖?!

有谁知道如何解决这个问题?

Bounty更新:问题已解决,有关indeterminateBehaviour正在运作的工作示例

5 个答案:

答案 0 :(得分:2)

<layer-list>
<item android:id="@android:id/background">
    <shape>
        <corners android:radius="2dip" />
        <gradient android:startColor="#43ffffff" android:centerColor="#43ffffff" android:centerY="0.75" android:endColor="#43ffffff" android:angle="270" />
    </shape>
</item>
<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="2dip" />
            <gradient android:startColor="#fff" android:endColor="#fff" android:angle="270" />
        </shape>
    </clip>
</item>

使用此drawable

Look at this picture

答案 1 :(得分:0)

您可以添加一个事件,具体取决于已编程的已知因素:

progressBar.setIndeterminate(true);

progressBar.setIndeterminate(false);

考虑它的风格完全取决于您对所提供数据的分析。

如果您知道它总是不确定并且具有始终如一的预期行为方式,请添加以下xml属性:

android:indeterminate="true"
android:indeterminateDrawable="@drawable/progress_indeterminate_horizontal"
android:indeterminateOnly="false"

答案 2 :(得分:0)

我找不到如何更改ProgressBar中的动画师,所以我建议你选择自己的绘图。

将进度绘制为矩形

在一个简单的例子中,让我们让进度看起来像一个矩形:

res/drawable/vector_drawable_progress_indeterminate_horizontal.xml(名称受core/res/res/drawable/vector_drawable_progress_indeterminate_horizontal.xml启发)

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="10dp"
    android:width="100dp"
    android:viewportHeight="10"
    android:viewportWidth="100" >
        <group
            android:name="rect1_grp"
            android:scaleX="1" >
            <path
                android:pathData="M 0,0 h 100 v 10 h -100 Z"
                android:fillColor="?attr/colorControlActivated" />
        </group>
</vector>

为水平刻度设置动画

当然,这个矩形根本没有动画,所以你想把它包装在一个改变它的水平刻度的对象中(scaleX的{​​{1}})。

rect1_grp

res/drawable/custom_progress.xml

唯一剩下要做的就是拥有自己的动画:

<?xml version="1.0" encoding="utf-8"?> <animated-vector android:drawable="@drawable/vector_drawable_progress_indeterminate_horizontal" xmlns:android="http://schemas.android.com/apk/res/android"> <target android:animation="@anim/progress_indeterminate_horizontal_rect1" android:name="rect1_grp"/> </animated-vector>

res/anim/progress_indeterminate_horizontal_rect1

动画从0f线性增长到1f,并以反向模式无限重复(这避免了两个动画师的序列:一个用于比例增加,一个用于减少)。

享受

现在,您所要做的就是在<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="1500" android:propertyName="scaleX" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" android:repeatMode="reverse" android:repeatCount="infinite"/> </set> 中使用此drawable:

res/layout/activity.xml

左手做

  • 我把进度剥夺到最低限度。您可能希望有一个背景可绘制。您可能还想恢复次要进度。
  • 您可以在动画中自定义插补器。

答案 3 :(得分:0)

您可以遵循的另一种方法是使用确定的样式,并再次设置0到100和100到0之间的值。:

   setProgress(100);
   // sleep animation duration
   setProgress(0);
   // sleep animation duration
   // repeat

我认为此解决方案不如having a custom inderminateDrawble优雅,因为它需要进行虚假的进度更新。

答案 4 :(得分:0)

将此添加到您的布局

~/processes/process.sh