带有圆角的进度栏?


81

我正在尝试实现此进度栏设计: 在此处输入图片说明

我目前的代码产生此: 在此处输入图片说明

这是代码:

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </clip>
</item>

我的进度条:

 <ProgressBar
            android:id="@+id/activeProgress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:progress="10"
            android:progressDrawable="@drawable/rounded_corners_progress_bar"/>

我尝试添加<size>的属性<shape><clip,以使进度外形有点小,但没有奏效。另外,进度条是扁平的,我想按照设计弯曲。为了实现设计,我需要更改什么?


Answers:


162

如何使进度形状变小?

您需要为进度项添加一些填充,如下所示:

<item android:id="@android:id/progress"
    android:top="2dp"
    android:bottom="2dp"
    android:left="2dp"
    android:right="2dp">

如何根据设计使进度条弯曲?

用替换<clip></clip>元素<scale android:scaleWidth="100%"></scale>。这将使形状随着其增长保持其形状-而不是被切断。不幸的是,一开始它会产生一些不必要的视觉效果-因为形状角没有足够的绘制空间。但这对于大多数情况可能已经足够了。

完整代码:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
 </item>

 <item android:id="@android:id/progress"
    android:top="1dp"
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp">

    <scale android:scaleWidth="100%">
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </scale>
 </item>
</layer-list>

4
@habibullah使用本机的ProgressBar和Layer-List是非常有限的。您可以轻松实现自定义进度栏以适应您的需求。例如,如果您具有纯色背景-只需使用前景9路径隐藏进度以外的所有内容。如果您要定位较新的Android版本,则可以直接使用内置的掩码支持(旧版本不支持)。另一个选择是使用一个库,这可能对您有益github.com/akexorcist/Android-RoundCornerProgressBar。如果仍然有问题,请发布新问题。干杯。
伊亚·比兰

1
@AkshayMahajan看到上面的评论
Eyal Biran

1
当我应用完整的代码时,尽管进度不是100%,但整个进度条都以我的主要颜色(colorPrimaryDark)着色。我在@android:id / background下添加了片段标记,它已修复,但背景消失了。我的临时解决方案是删除背景项,并向布局中添加背景色(无圆角)。
的Oguzhan科萨

5
在我的情况下,scalewith可以android:scaleWidth="100%"完成技巧,以便将其显示为带有圆角。非常感谢
Edison Spencer

1
谢谢。你救了我的日子。
阮·安·安

8

感谢Georgi Koemdzhiev提出的一个很好的问题和图片。对于那些想要与他相似的人,请执行以下操作。

1)为创建背景ProgressBar

progress_bar_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners android:radius="3dp" />
    <stroke android:color="@color/white" android:width="1dp" />
</shape>

2)为创建刻度ProgressBar

bent_progress_bar.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>
            <corners android:radius="2dp" />
            <solid android:color="@color/transparent" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <solid android:color="#ffff00" />
            </shape>
        </clip>
    </item>
</layer-list>

3)在布局文件中添加ProgressBar

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="6dp"
    android:layout_marginStart="20dp"
    android:layout_marginTop="10dp"
    android:layout_marginEnd="20dp"
    android:background="@drawable/progress_bar_background"
    >

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_margin="1dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/curved_progress_bar"
        />

</FrameLayout>

4

代码产生如下进度条
您可以同时使用内部进度颜色,边框颜色,空进度和透明颜色来实现进度条。

<?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>
        <corners android:radius="15dip" />
        <stroke android:width="1dp" android:color="@color/black" />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:centerColor="@color/trans"
                android:centerY="0.75"
                android:endColor="@color/black"
                android:angle="270"

                />
        </shape>
    </clip>
 </item>


 <item
    android:id="@android:id/progress"
    >
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:endColor="@color/black"
                android:angle="270" />
        </shape>
    </clip>
 </item>
 </layer-list>

您好Ravichandra,谢谢您的回答!您可以添加解释为什么您的代码回答他的问题吗?否则,将很难被其他用户使用。谢谢!
Nander Speerstra

感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案,正确的解释将极大地提高其长期价值,对于其他有类似问题的读者来说,这将是更加有用的。请编辑您的答案以添加一些解释,包括您所做的假设。此外,尝试解释为什么您的答案比已经对此问题给出的其他答案更好。
Qw3ry

3

通过材料零部件库,您可以使用ProgressIndicatorapp:indicatorCornerRadius属性。
就像是:

    <com.google.android.material.progressindicator.ProgressIndicator
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        app:indicatorSize="xxdp"
        app:indicatorCornerRadius="xdp"/>

在此处输入图片说明

它也可用于确定进度指示器(style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Determinate")。

注意:它至少需要version 1.3.0-alpha03

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.