web-dev-qa-db-fra.com

Android: Démarrer la barre de progression circulaire du haut (270 °)

J'ai défini une barre de progression circulaire à l'aide du "ciruclar_progress_bar.xml" pouvant être dessiné suivant

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

<item Android:id="@Android:id/progress">
    <shape
        Android:innerRadiusRatio="2.5"
        Android:shape="ring"
        Android:thicknessRatio="25.0" >
        <gradient
            Android:centerColor="@color/gray"
            Android:endColor="@color/gray"
            Android:startColor="@color/gray"
            Android:type="sweep" />
    </shape>
</item>
<item Android:id="@Android:id/secondaryProgress">
    <shape
        Android:innerRadiusRatio="2.5"
        Android:shape="ring"
        Android:thicknessRatio="25.0" >
        <gradient
            Android:centerColor="@color/green"
            Android:endColor="@color/green"
            Android:startColor="@color/green"
            Android:type="sweep" />
    </shape>
</item>

et j'ai utilisé ce drawable pour ProgressBar dans ma mise en page en utilisant le code suivant

  <ProgressBar
            Android:id="@+id/progressWheel"
            style="?android:attr/progressBarStyleHorizontal"
            Android:layout_width="152dp"
            Android:layout_height="152dp"
            Android:layout_centerInParent="true"
            Android:progress="100"
            Android:indeterminate="false"
            Android:progressDrawable="@drawable/circular_progress_bar" />

Je montre la progression sur la barre de progression avec le code suivant progressWheel.setSecondaryProgress(percent); (Utilisé comme progression secondaire, car la couleur verte doit apparaître au-dessus de la couleur noire de la bague.)

Ceci dessine la barre de progression circulaire dont la position de départ est à droite (0 °), comme indiqué dans l'image suivante.

enter image description here

Je veux que la progression commence par le haut, comme indiqué dans l'image suivante

enter image description here

J'ai essayé de mettre Android:angle="270" dans la balise de dégradé du fichier XML dessinable, mais sans succès. Est-il possible de commencer l'angle de balayage par le haut?

28
Rajkiran

Essayez de spécifier des degrés de rotation pour vos éléments de progression.

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:id="@Android:id/progress">
        <rotate
            Android:fromDegrees="270"
            Android:toDegrees="270"
            Android:pivotX="50%"
            Android:pivotY="50%" >
            <shape
                Android:innerRadiusRatio="2.5"
                Android:shape="ring"
                Android:thicknessRatio="25.0" >
                <gradient
                    Android:centerColor="@color/gray"
                    Android:endColor="@color/gray"
                    Android:startColor="@color/gray"
                    Android:type="sweep" />
            </shape>
        </rotate>
    </item>
    <item Android:id="@Android:id/secondaryProgress">
        <rotate
            Android:fromDegrees="270"
            Android:toDegrees="270"
            Android:pivotX="50%"
            Android:pivotY="50%" >
            <shape
                Android:innerRadiusRatio="2.5"
                Android:shape="ring"
                Android:thicknessRatio="25.0" >
                <gradient
                    Android:centerColor="@color/green"
                    Android:endColor="@color/green"
                    Android:startColor="@color/green"
                    Android:type="sweep" />
            </shape>
        </rotate>
    </item>
</layer-list>    
30
Zeba

Vous pouvez également appliquer une rotation à votre ProgressBar dans XML de présentation. Dans votre cas, -90 ° résoudrait votre problème.

    <ProgressBar
        Android:id="@+id/progressDemo"
        style="?android:attr/progressBarStyleHorizontal"
        Android:layout_width="152dp"
        Android:layout_height="152dp"
        Android:layout_centerInParent="true"
        Android:indeterminate="false"
        Android:progress="10"
        Android:rotation="-90"
        Android:progressDrawable="@drawable/circular_progress_bar" />
21
Bojan Kseneman

Grâce à @ Zeba, j'ai eu ma réponse. Pour les personnes ayant le même problème, voici le circular_progress_bar.xml mis à jour

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

<item Android:id="@Android:id/progress">
        <shape
            Android:innerRadiusRatio="2.5"
            Android:shape="ring"
            Android:thicknessRatio="25.0" >
            <gradient
                Android:angle="120"
                Android:centerColor="@color/gray"
                Android:endColor="@color/gray"
                Android:startColor="@color/gray"
                Android:type="sweep" />
        </shape>
</item>
<item Android:id="@Android:id/secondaryProgress">
    <rotate
        Android:fromDegrees="270"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:toDegrees="270" >
        <shape
            Android:innerRadiusRatio="2.5"
            Android:shape="ring"
            Android:thicknessRatio="25.0" >
            <gradient
                Android:angle="120"
                Android:centerColor="@color/green"
                Android:endColor="@color/green"
                Android:startColor="@color/green"
                Android:type="sweep" />
        </shape>
    </rotate>
</item>

5
Rajkiran

Voici comment j'ai créé progressbar circulaire avec pourcentage à l'intérieur du cercle en code pur sans aucune bibliothèque.

La référence est prise à partir d’ici: barre de progression circulaire Android

 enter image description here

commencez par créer un fichier pouvant être appelé appelé 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>

Maintenant, dans votre activity_main.xml, ajoutez ce qui suit:

  <?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>

Dans activity_main.xml, j'ai utilisé une image circulaire avec un fond blanc pour afficher un fond blanc autour du pourcentage. Voici l'image:

 enter image description here

Vous pouvez changer la couleur de cette image pour définir une couleur personnalisée autour du texte en pourcentage.

Maintenant, ajoutez enfin le code suivant à 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();
    }
}

Si vous voulez créer une barre de progression horizontale, suivez ce lien, il contient de nombreux exemples intéressants avec le code source:
http://www.skholingua.com/Android-basic/user-interface/form-widgets/progressbar

4
Parsania Hardik

Une solution plus simple que j'ai trouvée consiste à faire pivoter la vue de 270 degrés, à définir le texte intérieur sur transparent et à définir la nouvelle fonction TextView au-dessus de la barre de progression circulaire avec vos données.

<FrameLayout
    Android:id="@+id/linearLayout5"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <com.github.lzyzsd.circleprogress.DonutProgress
        Android:id="@+id/donut_progress_lodging"
        Android:layout_width="90dp"
        Android:layout_height="90dp"
        Android:layout_gravity="left|top"
        Android:layout_marginLeft="30dp"
        app:donut_text_color="@color/tw__transparent"
        Android:rotation="270"
        app:donut_finished_color="#34c6f1"
        app:donut_finished_stroke_width="5dp"
        app:donut_unfinished_color="#276894"
        app:donut_unfinished_stroke_width="5dp" />

  <TextView
        Android:layout_width="40dp"
        Android:layout_height="wrap_content"
        Android:text="0%"
        Android:textColor="#ffffff"
        Android:layout_marginLeft="55dp"
        Android:layout_marginBottom="10dp"
        Android:textAlignment="center"
        Android:id="@+id/textView_percentage_lodging"
        Android:layout_gravity="left|center_vertical" />

</FrameLayout>
1
ProBul

Une solution simple pour faire pivoter n’importe quelle vue d’un angle à l’autre est la rotation XML.

<ProgressBar
      Android:id="@+id/progress_bar"
      style="?android:attr/progressBarStyleHorizontal"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:max="100"
      Android:progress="0"
      Android:rotation="-90"
      Android:progressDrawable="@drawable/circular" />
0
Anonymous