我尝试实现一个水平不确定的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正在运作的工作示例
答案 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
答案 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