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.
Je veux que la progression commence par le haut, comme indiqué dans l'image suivante
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?
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>
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" />
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>
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
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:
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
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>
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" />