在Android Studio中绘制部分圆作为进度条

6

概要:

请参考图片1。

我需要保持绿色部分下面的灰色部分,这样当绿色减少时,灰色就会变得可见。但是我也希望未覆盖的部分(只有灰色)不在那里。最终结果是一个 2/3 的重叠圆形。


我正在尝试在Android Studio中创建一个2/3的圆形(带有圆角),作为进度条。但我做不到。我希望能得到您的帮助。

当前圆形: (图片1)

enter image description here

我需要的圆形:

enter image description here

形状:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="ring" android:innerRadiusRatio="2.5" android:useLevel="false"
            android:thicknessRatio="12">
            <solid android:color="#DDD"/>
     </shape>
    </item>
    <item>
        <shape android:shape="ring" android:innerRadiusRatio="2.5" android:useLevel="true"
            android:thicknessRatio="12">
            <solid android:color="@color/colorAccent"/>
        </shape>
    </item>
</layer-list>

页面布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/timerProgressBar"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1"
        android:indeterminateOnly="false"
        android:progressDrawable="@drawable/circle"
        android:rotation="-90"
        app:layout_constraintBottom_toTopOf="@+id/guidelineBottom"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guidelineTop"
        android:progress="10"/>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guidelineBottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guidelineTop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.1" />

 
</androidx.constraintlayout.widget.ConstraintLayout>
4个回答

5

我想创建自己的。你知道怎么做吗? - Newbie

3
你可以使用Material Components库提供的CircularProgressIndicator
类似这样:
        <com.google.android.material.progressindicator.CircularProgressIndicator
            android:id="@+id/progress"
            app:growMode="bidirectional"
            app:trackThickness="8dp"
            app:indicatorColor="@color/green"
            app:trackColor="@color/grey"
            app:indicatorSize="100dp"
            app:trackCornerRadius="8dp"
            android:progress="75"
            android:rotation="225"
            .../>

使用以下属性:

  • trackColor 可以改变灰色/未覆盖部分的颜色。使用父元素的背景色来隐藏它。
  • trackCornerRadius 可以改变指示器的圆角。

您需要根据进度值应用旋转。

progress.rotation = 180+((1-value/100)/2*360)

在此输入图片描述 在此输入图片描述

注意:它需要至少版本1.3.0-alpha04

在此输入图片描述


0

我认为你可以使用Lottie来解决你的问题。有多个LottieFiles可用,或者您可以使用自己的SVG,并在应用程序中使用Lottie加载它们。

例如,如果您使用此文件https://assets9.lottiefiles.com/datafiles/cOSizCzzp3gv6Qv/data.json,您可以将视图尺寸设置为显示圆的2/3,并设置动画的持续时间。您还可以设置动画的开始帧和结束帧。

有许多自定义选项可用。您可以在这里找到更多的lottie文件https://lottiefiles.com/ 和实现方法https://github.com/airbnb/lottie-android

希望这可以帮助你,祝你好运!


0
你需要将颜色从#DDD替换为透明,并在其上放置文本,这将给您想要的相同设计。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="ring" android:innerRadiusRatio="2.5" android:useLevel="false"
            android:thicknessRatio="12">
            <solid android:color="@android:color/transparent"/>
        </shape>
    </item>
    <item>
        <shape android:shape="ring" android:innerRadiusRatio="2.5" android:useLevel="true"
            android:thicknessRatio="12">
            <solid android:color="@color/colorAccent"/>
        </shape>
    </item>
</layer-list>

这个不起作用。我想要红色部分下面是灰色的。我想要2/3圆形(像红色一样),并且我也希望下面是灰色的。 - Newbie

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