How to implement a material design circular progress bar in android

前端 未结 8 849
小鲜肉
小鲜肉 2020-12-07 15:35

I want to make a material design circular progress bar like the one in Inbox by Gmail android app. How do I achieve this (in pre-lollipop devices)?

Am trying to achie

相关标签:
8条回答
  • 2020-12-07 15:57

    Nice implementation for material design circular progress bar (from rahatarmanahmed/CircularProgressView),

    <com.github.rahatarmanahmed.cpv.CircularProgressView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/progress_view"
        android:layout_width="40dp"
        android:layout_height="40dp"
        app:cpv_indeterminate="true"/>
    

    enter image description here

    0 讨论(0)
  • 2020-12-07 15:59

    With the Material Components library you can use the CircularProgressIndicator:

    Something like:

    <com.google.android.material.progressindicator.CircularProgressIndicator
          android:indeterminate="true"          
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          app:indicatorColor="@array/progress_colors"
          app:circularRadius="xxdp"
          app:growMode="incoming"/>
    

    where array/progress_colors is an array with the colors:

      <integer-array name="progress_colors">
        <item>@color/yellow_500</item>
        <item>@color/blue_700</item>
        <item>@color/red_500</item>
      </integer-array>
    

    Note: it requires at least the version 1.3.0-alpha04

    0 讨论(0)
  • 2020-12-07 16:03

    Was looking for a way to do this using simple xml, but couldn't find any helpful answers, so came up with this.

    This works on pre-lollipop versions too, and is pretty close to the material design progress bar. You just need to use this drawable as the indeterminate drawable in the ProgressBar layout.

    <?xml version="1.0" encoding="utf-8"?><!--<layer-list>-->
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="360">
        <layer-list>
            <item>
                <rotate xmlns:android="http://schemas.android.com/apk/res/android"
                    android:fromDegrees="-90"
                    android:toDegrees="-90">
                    <shape
                        android:innerRadiusRatio="2.5"
                        android:shape="ring"
                        android:thickness="2dp"
                        android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->
    
                        <gradient
                            android:angle="0"
                            android:endColor="#007DD6"
                            android:startColor="#007DD6"
                            android:type="sweep"
                            android:useLevel="false" />
                    </shape>
                </rotate>
            </item>
            <item>
                <rotate xmlns:android="http://schemas.android.com/apk/res/android"
                    android:fromDegrees="0"
                    android:toDegrees="270">
                    <shape
                        android:innerRadiusRatio="2.6"
                        android:shape="ring"
                        android:thickness="4dp"
                        android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->
                        <gradient
                            android:angle="0"
                            android:centerColor="#FFF"
                            android:endColor="#FFF"
                            android:startColor="#FFF"
                            android:useLevel="false" />
                    </shape>
                </rotate>
            </item>
        </layer-list>
    </rotate>
    

    set the above drawable in ProgressBar as follows:

      android:indeterminatedrawable="@drawable/above_drawable"
    
    0 讨论(0)
  • 2020-12-07 16:04

    Update

    As of 2019 this can be easily achieved using ProgressIndicator, in Material Components library, used with the Widget.MaterialComponents.ProgressIndicator.Circular.Indeterminate style.

    For more details please check Gabriele Mariotti's answer below.

    Old implementation

    Here is an awesome implementation of the material design circular intermediate progress bar https://gist.github.com/castorflex/4e46a9dc2c3a4245a28e. The implementation only lacks the ability add various colors like in inbox by android app but this does a pretty great job.

    0 讨论(0)
  • 2020-12-07 16:07

    The platform uses a vector drawable, so you can't reuse it as in in older versions.
    However, the support lib v4 contains a backport of this drawable : http://androidxref.com/5.1.0_r1/xref/frameworks/support/v4/java/android/support/v4/widget/MaterialProgressDrawable.java It has a @hide annotation (it is here for the SwipeRefreshLayout), but nothing prevents you from copying this class in your codebase.

    0 讨论(0)
  • 2020-12-07 16:11

    In addition to cozeJ4's answer, here's updated version of that gist

    Original one lacked imports and contained some errors. This one is ready to use.

    0 讨论(0)
提交回复
热议问题