在android

时间:2016-02-19 20:49:16

标签: android android-styles android-progressbar

样式确定进度条很容易,有很多教程可以实现。这是我在使用:

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="8dp"
    android:background="@drawable/progress_background"
    android:progressDrawable="@drawable/progress"
    android:id="@+id/progressBar" />

Drawable progress_background.xml

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <solid android:color="@color/colorAccent" />
                <corners android:radius="4dp" />
            </shape>
        </clip>
    </item>
</layer-list>

看起来像这样:

enter image description here

但是当尚未取得进展时,我想使用不确定的进展。所以我试过了:

<ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="@drawable/progress_background"
        android:progressDrawable="@drawable/progress"
        android:indeterminateTint="@color/colorAccent"
        android:indeterminateTintMode="src_in"
        android:indeterminate="true"
        android:id="@+id/progressBar" />

但不确定的进展并没有延伸到高度:

enter image description here

我尝试使用可绘制文件来设置样式,但它看起来像破坏的确定进度条(从0到100重新填充)。

所需的不确定进度条应该看起来像常规进度条,但高度为8dp,圆角。

3 个答案:

答案 0 :(得分:3)

默认的不确定进度条动画使用非9补丁png。因此它无法在8dp高度进度条上拉伸。您应该添加android:indeterminateDrawable自定义动画:

<animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
    <item android:drawable="@drawable/progressbar_indeterminate1" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate2" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate3" android:duration="50" />
    ...
    <item android:drawable="@drawable/progressbar_indeterminateX" android:duration="50" />
</animation-list>

然后使drawables像这样动画(它可以是xml或图像或​​9-patch):

Animation frame 1

Animation frame 2

从不版本的android(api21 +)使用AnimatedVectorDrawable来实现不确定的ProgressBar。

答案 1 :(得分:1)

我看到很多人都在看这篇文章所以我认为我应该编辑它并分享一个例子:

注意(这个例子不完整,它仍在进行中,但我认为这是一个起点)

GitHub:Github Example

此示例中的重要部分如下:在可绘制的xml文件中创建 custom_progress_bar_horizo​​ntal.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>
            <padding
                android:bottom="3dip"
                android:top="3dip"
                android:left="3dip"
                android:right="3dip"/>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="#2a2b2f"
                android:centerColor="#2a2b2f"
                android:centerY="0.50"
                android:endColor="#2a2b2f"
                android:angle="270" />
        </shape>
    </item>
    <item
        android:id="@android:id/progress">
        <clip>
            <shape>
                <corners
                    android:radius="5dip" />
                <gradient
                    android:startColor="#ff0e75af"
                    android:endColor="#ff1997e1"
                    android:angle="90" />
            </shape>
        </clip>
    </item>
</layer-list>

styles.xml

中添加以下代码
<style name="CustomProgressBar" parent="android:Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:progressDrawable">@drawable/custom_progress_bar_horizontal</item>
    <item name="android:minHeight">10dip</item>
    <item name="android:maxHeight">20dip</item>
</style>

在活动布局中添加样式后添加:

 <ProgressBar
        android:id="@+id/customProgress"
        style="@style/CustomProgressBar"
        android:layout_width="match_parent"/>

在框架中显示的进度显然有点棘手,因为你需要扩展ProgressBar类并在那里进行更改。

我将在这里留下一些示例,并在我将其添加到我的github项目时通知。

很好的例子,如果你想以你的方式取消进展:NumberProgressBar

其他进度条示例:

Custom progress bar 1

Custom progress bar 2

有关详细信息,请访问此处。 Android horizontal progress bar?

答案 2 :(得分:0)

你知道,android有一个名为:LinearProgressIndicator的视图 你可以在水平进度条中使用不确定动画。

enter image description here

> df
  iter   x
1   10 100

p.s - 它有一种奇怪的行为,用于以编程方式切换不确定值。这样做你应该 将可见性设置为不可见, 设置不确定的布尔值, 然后再次显示视图。
示例:

 <com.google.android.material.progressindicator.LinearProgressIndicator
        android:layout_width="280dp"
        android:layout_height="12dp"
        android:indeterminate="true"
        app:indicatorColor="@color/app_brand_primary"
        app:trackColor="@color/color_divider"
        app:trackCornerRadius="6dp"
        app:trackThickness="12dp" />

问题: https://github.com/material-components/material-components-android/issues/1921