更改ProgressBar水平不确定行为

6
我想实现一个水平的不确定进度条,它会在结束时反转动画。为了澄清,我希望进度条从0到100进行动画处理,之后再从100到0反向动画处理。这是标准动画的视频,我想在结束时将其反转。
根据ProgressBar文档,这应该可以通过xml实现,但我无法做到。您可以设置repeat(标准?)或cycle(这就是我想要的)
这是我的实现:
<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秒,另一个设置为10秒。最后,两个进度加载器的长度相同,这让我想到,样式可能被其他地方覆盖了?!

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

赏金更新:问题已解决,提供了一个工作示例,其中indeterminateBehaviour正在工作


style="?android:attr/progressBarStyleHorizontal" 继承了哪些值? - Tim
@TimCastelijns: 其实,我不知道。那是标准的Android父级。我完全不知道怎么查看这些值 :-/ - longi
你看过这个吗:https://dev59.com/PGw15IYBdhLWcg3wtd4g#6450417 - KunalK
@KunalK 是的,我找到了这个,但那是另一个话题。我只是简单地寻找一个工作示例,在其中android:indeterminateDurationandroid:indeterminateBehavior在xml中真正按照文档工作,以便下次我遇到这些问题。 - longi
5个回答

2
我找不到如何更改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>

使水平缩放动画化

当然,这个矩形根本没有被动画化,所以你需要将其包裹在一个对象中,以改变其水平缩放比例(rect1_grpscaleX)。

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:
<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>

动画将比例从0f线性增长到1f,并以反向模式无限重复(这避免了有一个放大和缩小的动画序列)。

享受

现在,你只需要在res/layout/activity.xml中使用这个可绘制对象即可:
<ProgressBar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="8dip"
    android:indeterminate="true"
    android:indeterminateDrawable="@drawable/custom_progress" />

剩余任务

  • 我将进度条最简化。您可能希望有一个背景可绘制对象。您还可以恢复次要进度。
  • 您可以在动画中自定义插值器。

所以基本上,使用自定义动画代替 android:indeterminateBehavior="cycle"android:indeterminateDuration="10000"?我在想这些值是否可能被设备设置或样式覆盖,这就是为什么我无法使它们工作的原因吗? - longi

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>

使用此可绘制对象

查看此图片


1
您可以添加一个事件,在已知因素的情况下,程序化地执行以下操作:
progressBar.setIndeterminate(true);

或者

progressBar.setIndeterminate(false);

考虑到风格完全取决于所呈现数据的分析结果。

如果您知道它总是不确定的,并且具有一致的预期行为风格,请添加这些XML属性:

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

0

你可以尝试另一种方法,即使用确定的样式,并将值从0设置到100,然后再从100设置回0。

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

我认为这个解决方案不如 使用自定义的不确定进度Drawable 那么优雅,因为它需要有这些虚假的进度更新。


0

将此添加到您的布局中,

       <ProgressBar
        android:id="@+id/pbProcessing"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/frame_getgas"
        android:indeterminateOnly="true"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接