Wie erstelle ich in Android einen kreisförmigen Fortschrittsbalken, der sich darauf dreht?

154

Ich versuche einen abgerundeten Fortschrittsbalken zu erstellen. Das möchte ich erreichen

Es gibt einen grauen Hintergrundring. Darüber wird ein Fortschrittsbalken mit blauer Farbe angezeigt, der sich in 60 oder einer beliebigen Anzahl von Sekunden auf einer Kreisbahn von 0 auf 360 bewegt.

Geben Sie hier die Bildbeschreibung ein

Hier ist mein Beispielcode.

<ProgressBar
            android:id="@+id/ProgressBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            style="?android:attr/progressBarStyleLarge"
            android:indeterminateDrawable="@drawable/progressBarBG"
            android:progress="50"
            />

Dazu erstelle ich im zeichnbaren "progressBarBG" eine Ebenenliste und gebe innerhalb dieser Ebenenliste zwei Elemente wie gezeigt.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape
            android:shape="ring"
            android:innerRadius="64dp"
            android:thickness="8dp"
            android:useLevel="false">

        <solid android:color="@color/grey" />
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape
                android:shape="ring"
                android:innerRadius="64dp"
                android:thickness="8dp"
                android:useLevel="false">

            <solid android:color="@color/blue" />
        </shape>
    </clip>
</item>

Jetzt wird der erste graue Ring gut erzeugt. Der blaue Ring beginnt jedoch links vom Zeichen und geht nach rechts, genau wie ein linearer Fortschrittsbalken funktioniert. So wird der Fortschritt bei 50% angezeigt, wobei der rote Farbpfeil die Richtung anzeigt.

Geben Sie hier die Bildbeschreibung ein

Ich möchte den blauen Fortschrittsbalken wie erwartet auf einer Kreisbahn verschieben.

Saurav Srivastava
quelle
9
Nicht sicher, warum Sie gewählt wurden, scheint ein bisschen unfair.
BenjaminPaul
1
Ich habe nachgesehen, bevor ich diese Frage gestellt habe. Ich habe einige Antworten gefunden, aber sie haben nicht für das funktioniert, was ich erreichen möchte. Vielleicht hat mich jemand abgelehnt, weil ich dachte, dies sei ein doppelter Beitrag.
Saurav Srivastava
1
Vielleicht kann dies Sie in die richtige Richtung weisen. github.com/grmaciel/two-level-circular-progress-bar
gmemario
1
Sie können diese Bibliothek verwenden github.com/emre1512/CircleProgressBar
Zapdos
1
Würden Sie bitte einen der großzügigen Menschen belohnen, der versucht hat, eine Lösung für Ihre großen Bemühungen zu finden, indem Sie eine der bereitgestellten Antworten akzeptieren?
CEO tech4lifeapps

Antworten:

321

Hier sind meine beiden Lösungen.

Kurze Antwort:

Anstatt ein zu erstellen layer-list, habe ich es in zwei Dateien aufgeteilt. Eins für ProgressBarund eins für seinen Hintergrund.

Dies ist die ProgressDrawableDatei (Ordner @drawable): Circular_Progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        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>

Und das ist für seine background(@drawable Ordner): circle_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="2.5"
    android:thickness="1dp"
    android:useLevel="false">

    <solid android:color="#CCC" />

</shape>

Und am Ende innerhalb des Layouts, an dem Sie arbeiten:

<ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/circular_progress_bar"
        android:background="@drawable/circle_shape"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        android:progress="65" />

Hier ist das Ergebnis:

Ergebnis 1

Lange Antwort:

Verwenden Sie eine benutzerdefinierte Ansicht, die das erbt android.view.View

Ergebnis 2

Hier ist das vollständige Projekt auf Github

M. Reza Nasirloo
quelle
@Pedram Wie soll ich den Prozentsatz für den Fortschrittsbalken festlegen? Wie zum Beispiel derzeit sind es 50%. Wie soll ich die 50% auf den Fortschrittsbalken setzen?
@ 20 Cent, Lesen Sie die Dokumentation. Sie sollten einen Verweis auf Ihren Fortschrittsbalken erhalten und die setProgressMethode aufrufen und dann den Wert übergeben. google.com/…
M. Reza Nasirloo
Ich bin verrückt geworden, als ich versucht habe, die richtigen Werte zu finden, rote Dutzende von Stackoverflow-Themen, nur um hier die Lösung zu finden .. habe es android:fromDegrees="270" android:toDegrees="270"gelöst !! Danke vielmals!
Henrique de Sousa
@Skynet Ja, und ich habe nicht versucht, das Problem zu beheben, da ich es vorziehen würde, eine vollständig angepasste
Version
1
@MimArmand Hey danke, tatsächlich funktioniert es wieder in Lollipop 5.1 Update, und diese Zeile behebt das Problem für API 21.
M. Reza Nasirloo
23

Ich habe mit einfachen Weg getan:

Bitte überprüfen Sie den Screenshot auf das gleiche.

CustomProgressBarActivity.java :

public class CustomProgressBarActivity extends AppCompatActivity {

    private TextView txtProgress;
    private ProgressBar progressBar;
    private int pStatus = 0;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_progressbar);

        txtProgress = (TextView) findViewById(R.id.txtProgress);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (pStatus <= 100) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setProgress(pStatus);
                            txtProgress.setText(pStatus + " %");
                        }
                    });
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    pStatus++;
                }
            }
        }).start();

    }
}

activity_custom_progressbar.xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.skholingua.android.custom_progressbar_circular.MainActivity" >


    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_centerInParent="true"
            android:indeterminate="false"
            android:max="100"
            android:progress="0"
            android:progressDrawable="@drawable/custom_progressbar_drawable"
            android:secondaryProgress="0" />


        <TextView
            android:id="@+id/txtProgress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/progressBar"
            android:layout_centerInParent="true"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </RelativeLayout>



</RelativeLayout>

custom_progressbar_drawable.xml :

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="-90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="270" >

    <shape
        android:shape="ring"
        android:useLevel="false" >
        <gradient
            android:centerY="0.5"
            android:endColor="#FA5858"
            android:startColor="#0099CC"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

</rotate>

Hoffe das wird dir helfen.

Hiren Patel
quelle
Hallo Hiren, ich versuche nur zwei Farben in der Ansicht anzuzeigen. Rot und Grün. Aber ich sehe auch eine Mischung aus Rot und Grün im Kreis. Wie kann ich das entfernen?
Lokesh Pandey
20

Ich habe ein detailliertes Beispiel für einen kreisförmigen Fortschrittsbalken in Android hier auf meinem Blog Demonuts.com geschrieben . Dort können Sie auch den vollständigen Quellcode und die Erklärung finden.

Hier ist, wie ich einen kreisförmigen Fortschrittsbalken mit einem Prozentsatz innerhalb des Kreises in reinem Code ohne Bibliothek erstellt habe.

Geben Sie hier die Bildbeschreibung ein

Erstellen Sie zunächst eine zeichnbare Datei mit dem Namen circular.xml

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/secondaryProgress">
        <shape
            android:innerRadiusRatio="6"
            android:shape="ring"
            android:thicknessRatio="20.0"
            android:useLevel="true">


            <gradient
                android:centerColor="#999999"
                android:endColor="#999999"
                android:startColor="#999999"
                android:type="sweep" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">

            <shape
                android:innerRadiusRatio="6"
                android:shape="ring"
                android:thicknessRatio="20.0"
                android:useLevel="true">


                <rotate
                    android:fromDegrees="0"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:toDegrees="360" />

                <gradient
                    android:centerColor="#00FF00"
                    android:endColor="#00FF00"
                    android:startColor="#00FF00"
                    android:type="sweep" />

            </shape>
        </rotate>
    </item>
</layer-list>

Nun activity_main.xml fügen Sie Folgendes hinzu:

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dialog"
    tools:context="com.example.parsaniahardik.progressanimation.MainActivity">

    <ProgressBar

        android:id="@+id/circularProgressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:indeterminate="false"
        android:max="100"
        android:progress="50"
        android:layout_centerInParent="true"
        android:progressDrawable="@drawable/circular"
        android:secondaryProgress="100"
        />

    <ImageView
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:background="@drawable/whitecircle"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:gravity="center"
        android:text="25%"
        android:layout_centerInParent="true"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="20sp" />

</RelativeLayout>

In activity_main.xmlIch habe ein kreisförmiges Bild mit weißem Hintergrund verwendet, um den weißen Hintergrund um den Prozentsatz herum anzuzeigen. Hier ist das Bild:

Geben Sie hier die Bildbeschreibung ein

Sie können die Farbe dieses Bildes ändern, um die benutzerdefinierte Farbe für den prozentualen Text festzulegen.

Fügen Sie nun endlich folgenden Code hinzu MainActivity.java:

import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.DecelerateInterpolator;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    int pStatus = 0;
    private Handler handler = new Handler();
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        Drawable drawable = res.getDrawable(R.drawable.circular);
        final ProgressBar mProgress = (ProgressBar) findViewById(R.id.circularProgressbar);
        mProgress.setProgress(0);   // Main Progress
        mProgress.setSecondaryProgress(100); // Secondary Progress
        mProgress.setMax(100); // Maximum Progress
        mProgress.setProgressDrawable(drawable);

      /*  ObjectAnimator animation = ObjectAnimator.ofInt(mProgress, "progress", 0, 100);
        animation.setDuration(50000);
        animation.setInterpolator(new DecelerateInterpolator());
        animation.start();*/

        tv = (TextView) findViewById(R.id.tv);
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (pStatus < 100) {
                    pStatus += 1;

                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            mProgress.setProgress(pStatus);
                            tv.setText(pStatus + "%");

                        }
                    });
                    try {
                        // Sleep for 200 milliseconds.
                        // Just to display the progress slowly
                        Thread.sleep(8); //thread will take approx 1.5 seconds to finish
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

Wenn Sie einen horizontalen Fortschrittsbalken erstellen möchten, folgen Sie diesem Link. Er enthält viele wertvolle Beispiele mit Quellcode:
http://www.skholingua.com/android-basic/user-interface/form-widgets/progressbar

Parsania Hardik
quelle
15

Ich habe eine Open Source-Bibliothek auf GitHub CircularProgressBar realisiert , die auf einfachste Weise genau das tut, was Sie wollen:

Gif Demo CircularProgressBar

VERWENDUNG

Um eine zirkuläre ProgressBar zu erstellen, fügen Sie CircularProgressBar in Ihr Layout-XML ein und fügen Sie die CircularProgressBar-Bibliothek in Ihren Projektor ein, oder Sie können sie auch über Gradle abrufen:

compile 'com.mikhaellopez:circularprogressbar:1.0.0'

XML

<com.mikhaellopez.circularprogressbar.CircularProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:background_progressbar_color="#FFCDD2"
    app:background_progressbar_width="5dp"
    app:progressbar_color="#F44336"
    app:progressbar_width="10dp" />

Sie müssen die folgenden Eigenschaften in Ihrem XML verwenden, um Ihre CircularProgressBar zu ändern.

Eigenschaften:

  • app:progress (Ganzzahl) >> Standard 0
  • app:progressbar_color (Farbe) >> Standard SCHWARZ
  • app:background_progressbar_color (Farbe) >> Standard GRAU
  • app:progressbar_width (Dimension) >> Standard 7dp
  • app:background_progressbar_width (Dimension) >> Standard 3dp

JAVA

CircularProgressBar circularProgressBar = (CircularProgressBar)findViewById(R.id.yourCircularProgressbar);
circularProgressBar.setColor(ContextCompat.getColor(this, R.color.progressBarColor));
circularProgressBar.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundProgressBarColor));
circularProgressBar.setProgressBarWidth(getResources().getDimension(R.dimen.progressBarWidth));
circularProgressBar.setBackgroundProgressBarWidth(getResources().getDimension(R.dimen.backgroundProgressBarWidth));
int animationDuration = 2500; // 2500ms = 2,5s
circularProgressBar.setProgressWithAnimation(65, animationDuration); // Default duration = 1500ms

Fork oder Laden Sie diese Bibliothek hier herunter >> https://github.com/lopspower/CircularProgressBar

lopez.mikhael
quelle
Ich versuche das, es ist wirklich großartig, aber jetzt habe ich jeden Animationsänderungs-Listener gefunden. Kennst du einen Weg?
Md Imran Choudhury
@ lopez.mikhael Hey, hast du irgendwelche Ideen, wie man ein Bild zwischen das Rundschreiben einfügt?
Hyperfkcb
@DeniseTan Sie können einfach ein FrameLayout oder ein RelativeLayout verwenden, um dies zu tun.
lopez.mikhael
8

Hier ist eine einfache benutzerdefinierte Ansicht für den Fortschritt des Anzeigekreises. Sie können mehr ändern und optimieren, um es für Ihr Projekt geeignet zu machen.

class CircleProgressBar @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    private val backgroundWidth = 10f
    private val progressWidth = 20f

    private val backgroundPaint = Paint().apply {
        color = Color.LTGRAY
        style = Paint.Style.STROKE
        strokeWidth = backgroundWidth
        isAntiAlias = true
    }

    private val progressPaint = Paint().apply {
        color = Color.RED
        style = Paint.Style.STROKE
        strokeWidth = progressWidth
        isAntiAlias = true
    }

    var progress: Float = 0f
        set(value) {
            field = value
            invalidate()
        }

    private val oval = RectF()
    private var centerX: Float = 0f
    private var centerY: Float = 0f
    private var radius: Float = 0f

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        centerX = w.toFloat() / 2
        centerY = h.toFloat() / 2
        radius = w.toFloat() / 2 - progressWidth
        oval.set(centerX - radius,
                centerY - radius,
                centerX + radius,
                centerY + radius)
        super.onSizeChanged(w, h, oldw, oldh)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawCircle(centerX, centerY, radius, backgroundPaint)
        canvas?.drawArc(oval, 270f, 360f * progress, false, progressPaint)
    }
}

Beispiel mit

xml

<com.example.androidcircleprogressbar.CircleProgressBar
    android:id="@+id/circle_progress"
    android:layout_width="200dp"
    android:layout_height="200dp" />

Kotlin

class MainActivity : AppCompatActivity() {
    val TOTAL_TIME = 10 * 1000L

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        timeOutRemoveTimer.start()
    }

    private var timeOutRemoveTimer = object : CountDownTimer(TOTAL_TIME, 10) {
        override fun onFinish() {
            circle_progress.progress = 1f
        }

        override fun onTick(millisUntilFinished: Long) {
            circle_progress.progress = (TOTAL_TIME - millisUntilFinished).toFloat() / TOTAL_TIME
        }
    }
}

Ergebnis

Phan Van Linh
quelle
5

Ich bin neu, kann also keinen Kommentar abgeben, dachte aber, ich möchte den faulen Fix teilen. Ich verwende auch Pedrams ursprünglichen Ansatz und bin gerade auf dasselbe Lollipop-Problem gestoßen. Aber Alanv in einem anderen Beitrag hatte eine einzeilige Korrektur. Es ist eine Art Fehler oder Versehen in API21. Fügen Sie android:useLevel="true"Ihrem Kreis buchstäblich nur xml hinzu. Pedrams neuer Ansatz ist immer noch die richtige Lösung, aber ich dachte nur, ich teile auch die faule Lösung.

Miao Liu
quelle
3

Versuchen Sie diese Methode, um eine Bitmap zu erstellen und auf Bildansicht zu setzen.

private void circularImageBar(ImageView iv2, int i) {


    Bitmap b = Bitmap.createBitmap(300, 300,Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(b); 
    Paint paint = new Paint();

        paint.setColor(Color.parseColor("#c4c4c4"));
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(150, 150, 140, paint);

        paint.setColor(Color.parseColor("#FFDB4C"));
        paint.setStrokeWidth(10);   
        paint.setStyle(Paint.Style.FILL);
        final RectF oval = new RectF();
        paint.setStyle(Paint.Style.STROKE);
        oval.set(10,10,290,290);

        canvas.drawArc(oval, 270, ((i*360)/100), false, paint);
        paint.setStrokeWidth(0);    
        paint.setTextAlign(Align.CENTER);
        paint.setColor(Color.parseColor("#8E8E93")); 
        paint.setTextSize(140);

        canvas.drawText(""+i, 150, 150+(paint.getTextSize()/3), paint); 

        iv2.setImageBitmap(b);
}
Mani
quelle
2

https://github.com/passsy/android-HoloCircularProgressBar ist ein Beispiel für eine Bibliothek, die dies tut. Wie Tenfour04 feststellte, muss es etwas benutzerdefiniert sein, da dies nicht sofort unterstützt wird. Wenn sich diese Bibliothek nicht wie gewünscht verhält, können Sie sie aufteilen und die Details ändern, damit sie nach Ihren Wünschen funktioniert. Wenn Sie etwas implementieren, das andere dann wiederverwenden können, können Sie sogar eine Pull-Anfrage senden, um das wieder zusammenzuführen!

Travis
quelle
Ich habe diese Bibliothek auch gesehen, wollte aber keine andere Bibliothek eines Drittanbieters nur für diese kleine Aufgabe verwenden. Ich werde jedoch beide von Ihnen und Tenfour04 genannten Methoden ausprobieren, um herauszufinden, welche für mich funktioniert, und hier antworten.
Saurav Srivastava
1
@SauravSrivastava: Ich suche auch nach einer ähnlichen Animation in meiner App. Haben Sie die Lösung gefunden? Wenn ja, teilen Sie uns bitte die Lösung mit.
Basher51
@Travis Bitte sehen Sie diese Frage - stackoverflow.com/questions/44801280/…
Kumar
2

@Pedram, Ihre alte Lösung funktioniert auch in Lollipop einwandfrei (und besser als die neue, da sie überall verwendet werden kann, auch in Remote-Ansichten). Ändern Sie einfach Ihren circular_progress_bar.xmlCode wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        android:useLevel="true"> <!-- Just add this line -->
        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>
mim
quelle
2
Hervorragende Bemerkung zu Android: useLevel = "true" !!! Sie haben mir geholfen, wichtige Probleme auf Android 5 zu lösen! Vielen Dank!
DmitryKanunnikoff
2
package com.example.ankitrajpoot.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;


public class MainActivity extends Activity {

    private ProgressBar spinner;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner=(ProgressBar)findViewById(R.id.progressBar);
        spinner.setVisibility(View.VISIBLE);
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loadingPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">

<ProgressBar
    android:id="@+id/progressBar"

    android:layout_width="48dp"
    style="?android:attr/progressBarStyleLarge"
    android:layout_height="48dp"
    android:indeterminateDrawable="@drawable/circular_progress_bar"
    android:indeterminate="true" />
</RelativeLayout>





<?xml version="1.0" encoding="utf-8"?>
<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="0"
    android:toDegrees="1080">
    <shape
        android:shape="ring"
        android:innerRadiusRatio="3"
        android:thicknessRatio="8"
        android:useLevel="false">

        <size
            android:width="56dip"
            android:height="56dip" />

        <gradient
            android:type="sweep"
            android:useLevel="false"
            android:startColor="@android:color/transparent"
            android:endColor="#1e9dff"
            android:angle="0"
            />

    </shape>
</rotate>
Ankit Rajpoot
quelle
Sie sollten eine Beschreibung der vorgeschlagenen Lösung hinzufügen.
il_raffa
2

Mit der Material Components Library können Sie die ProgressIndicatormit einem Widget.MaterialComponents.ProgressIndicator.Circular.DeterminateStil verwenden.

Etwas wie:

<com.google.android.material.progressindicator.ProgressIndicator
    style="@style/Widget.MaterialComponents.ProgressIndicator.Circular.Determinate"
    app:indicatorColor="@color/...."
    app:trackColor="@color/...."
    app:circularRadius="64dp"/>

Sie können diese Attribute verwenden:

  • circularRadius: Definiert den Radius der kreisförmigen Fortschrittsanzeige
  • trackColor: Die Farbe, die für die Fortschrittsanzeige verwendet wird. Wenn nicht definiert, wird es auf das gesetzt indicatorColorund das android:disabledAlphaaus dem Thema angewendet.
  • indicatorColor: Die einzelne Farbe, die für den Indikator im bestimmten / unbestimmten Modus verwendet wird. Standardmäßig wird die Primärfarbe des Themas verwendet

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie progressIndicator.setProgressCompat((int) value, true);diese Option, um den Wert im Indikator zu aktualisieren.

Hinweis: Es ist mindestens die Version erforderlich 1.3.0-alpha01.

Gabriele Mariotti
quelle
Was ist die erforderliche Bibliotheksabhängigkeit?
Bikram
@bikram Die von Google bereitgestellte Material Components-Bibliothek .
Gabriele Mariotti
Ich habe die Implementierung 'com.google.android.material: material: 1.1.0' zu build.gradle hinzugefügt, aber ProgressIndicator wird immer noch nicht angezeigt.
Bikram
@bikram Wie in der Antwort beschrieben: Es erfordert mindestens die Version 1.3.0-alpha01.
Gabriele Mariotti
1

Veränderung

android:useLevel="false"

zu

android:useLevel="true"

für die zweite sahpe mit id="@android:id/progress

hoffe, es funktioniert

ASHMIL HUSSAIN K.
quelle