Je travaille sur une application dans laquelle je souhaite afficher une ProgressBar
, mais je souhaite remplacer la valeur par défaut Android ProgressBar
.
Alors, comment puis-je personnaliser la ProgressBar
?
Ai-je besoin de graphiques et d'animations pour cela?
J'ai lu le post suivant mais je ne pouvais pas le faire fonctionner:
Personnaliser une ProgressBar
nécessite de définir l'attribut ou les propriétés pour l'arrière-plan et la progression de votre barre de progression.
Créez un fichier XML nommé customprogressbar.xml
dans votre dossier res->drawable
:
custom_progressbar.xml
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- Define the background properties like color etc -->
<item Android:id="@Android:id/background">
<shape>
<gradient
Android:startColor="#000001"
Android:centerColor="#0b131e"
Android:centerY="1.0"
Android:endColor="#0d1522"
Android:angle="270"
/>
</shape>
</item>
<!-- Define the progress properties like start color, end color etc -->
<item Android:id="@Android:id/progress">
<clip>
<shape>
<gradient
Android:startColor="#007A00"
Android:centerColor="#007A00"
Android:centerY="1.0"
Android:endColor="#06101d"
Android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
Maintenant, vous devez définir la propriété progressDrawable
dans customprogressbar.xml
(drawable)
Vous pouvez le faire dans le fichier XML ou dans l'activité (au moment de l'exécution).
Procédez comme suit dans votre XML:
<ProgressBar
Android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
Android:progressDrawable="@drawable/custom_progressbar"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
Au moment de l'exécution, procédez comme suit
// Get the Drawable custom_progressbar
Drawable draw=res.getDrawable(R.drawable.custom_progressbar);
// set the drawable as progress drawable
progressBar.setProgressDrawable(draw);
Edit: mise en page XML corrigée
dans votre xml
<ProgressBar
Android:id="@+id/progressBar1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
style="@style/CustomProgressBar"
Android:layout_margin="5dip" />
Et en res/values/styles.xml
:
<resources>
<style name="CustomProgressBar" parent="Android:Widget.ProgressBar.Horizontal">
<item name="Android:indeterminateOnly">false</item>
<item name="Android:progressDrawable">@drawable/custom_progress_bar_horizontal</item>
<item name="Android:minHeight">10dip</item>
<item name="Android:maxHeight">20dip</item>
</style>
<style name="AppTheme" parent="Android:Theme.Light" />
</resources>
Et custom_progress_bar_horizontal
est un fichier XML stocké dans un dossier pouvant être dessiné qui définit votre barre de progression personnalisée. Pour plus de détails voir ce blog .
J'espère que cela t'aidera.
En cas de complexe ProgressBar
comme celui-ci,
utilisez ClipDrawable
.
REMARQUE: je n'ai pas utilisé
ProgressBar
ici dans cet exemple. J'ai atteint cela en utilisant ClipDrawable en coupant l'image avecAnimation
.
Drawable
qui coupe une autre Drawable
en fonction du niveau actuel de cette Drawable
. Vous pouvez contrôler le degré de largeur et de hauteur de l'enfant Drawable
en fonction du niveau, ainsi qu'une gravité permettant de contrôler l'emplacement du conteneur dans son ensemble. Most often used to implement things like progress bars
, en augmentant le niveau du dessin avec setLevel()
.
NOTE: Le dessin est complètement coupé et n'est pas visible quand le niveau est 0 et complètement révélé lorsque le niveau est 10 000.
J'ai utilisé ces deux images pour rendre cette CustomProgressBar
.
scall.png
ballon_progress.png
MainActivity.Java
public class MainActivity extends ActionBarActivity {
private EditText etPercent;
private ClipDrawable mImageDrawable;
// a field in your class
private int mLevel = 0;
private int fromLevel = 0;
private int toLevel = 0;
public static final int MAX_LEVEL = 10000;
public static final int LEVEL_DIFF = 100;
public static final int DELAY = 30;
private Handler mUpHandler = new Handler();
private Runnable animateUpImage = new Runnable() {
@Override
public void run() {
doTheUpAnimation(fromLevel, toLevel);
}
};
private Handler mDownHandler = new Handler();
private Runnable animateDownImage = new Runnable() {
@Override
public void run() {
doTheDownAnimation(fromLevel, toLevel);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPercent = (EditText) findViewById(R.id.etPercent);
ImageView img = (ImageView) findViewById(R.id.imageView1);
mImageDrawable = (ClipDrawable) img.getDrawable();
mImageDrawable.setLevel(0);
}
private void doTheUpAnimation(int fromLevel, int toLevel) {
mLevel += LEVEL_DIFF;
mImageDrawable.setLevel(mLevel);
if (mLevel <= toLevel) {
mUpHandler.postDelayed(animateUpImage, DELAY);
} else {
mUpHandler.removeCallbacks(animateUpImage);
MainActivity.this.fromLevel = toLevel;
}
}
private void doTheDownAnimation(int fromLevel, int toLevel) {
mLevel -= LEVEL_DIFF;
mImageDrawable.setLevel(mLevel);
if (mLevel >= toLevel) {
mDownHandler.postDelayed(animateDownImage, DELAY);
} else {
mDownHandler.removeCallbacks(animateDownImage);
MainActivity.this.fromLevel = toLevel;
}
}
public void onClickOk(View v) {
int temp_level = ((Integer.parseInt(etPercent.getText().toString())) * MAX_LEVEL) / 100;
if (toLevel == temp_level || temp_level > MAX_LEVEL) {
return;
}
toLevel = (temp_level <= MAX_LEVEL) ? temp_level : toLevel;
if (toLevel > fromLevel) {
// cancel previous process first
mDownHandler.removeCallbacks(animateDownImage);
MainActivity.this.fromLevel = toLevel;
mUpHandler.post(animateUpImage);
} else {
// cancel previous process first
mUpHandler.removeCallbacks(animateUpImage);
MainActivity.this.fromLevel = toLevel;
mDownHandler.post(animateDownImage);
}
}
}
activity_main.xml
<LinearLayout 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:paddingLeft="16dp"
Android:paddingRight="16dp"
Android:paddingTop="16dp"
Android:paddingBottom="16dp"
Android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal">
<EditText
Android:id="@+id/etPercent"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:inputType="number"
Android:maxLength="3" />
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Ok"
Android:onClick="onClickOk" />
</LinearLayout>
<FrameLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center">
<ImageView
Android:id="@+id/imageView2"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:src="@drawable/scall" />
<ImageView
Android:id="@+id/imageView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/clip_source" />
</FrameLayout>
clip_source.xml
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:clipOrientation="vertical"
Android:drawable="@drawable/ballon_progress"
Android:gravity="bottom" />
En cas de complexe HorizontalProgressBar
, il suffit de changer cliporientation
dans clip_source.xml comme ceci,
Android:clipOrientation="horizontal"
Vous pouvez télécharger la démo complète à partir de ici .
La personnalisation de la couleur de la barre de progression, notamment en cas de type de filage, nécessite un fichier XML et des codes d’initiation dans leurs fichiers Java respectifs.
Créez un fichier XML et nommez-le progressbar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
tools:context=".Radio_Activity" >
<LinearLayout
Android:id="@+id/progressbar"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >
<ProgressBar
Android:id="@+id/spinner"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >
</ProgressBar>
</LinearLayout>
</LinearLayout>
Utilisez le code suivant pour obtenir le disque dans la couleur attendue. Ici, nous utilisons le code hexadécimal pour afficher le disque en couleur bleue.
Progressbar spinner = (ProgressBar) progrees.findViewById(R.id.spinner);
spinner.getIndeterminateDrawable().setColorFilter(Color.parseColor("#80DAEB"),
Android.graphics.PorterDuff.Mode.MULTIPLY);
Il existe deux types de barres de progression appelées barre de progression déterminée (durée fixe) et barre de progression indéterminée (durée inconnue).
Les tirages pour les deux types de barres de progression peuvent être personnalisés en définissant dessin comme ressources xml. Pour plus d'informations sur les styles et la personnalisation de la barre de progression, visitez la page http://www.zoftino.com/Android-progressbar-and-custom-progressbar-examples .
Personnalisation de la barre de progression fixe ou horizontale:
Au-dessous de xml, vous trouverez une ressource utilisable pour la personnalisation de la barre de progression horizontale.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@Android:id/background"
Android:gravity="center_vertical|fill_horizontal">
<shape Android:shape="rectangle"
Android:tint="?attr/colorControlNormal">
<corners Android:radius="8dp"/>
<size Android:height="20dp" />
<solid Android:color="#90caf9" />
</shape>
</item>
<item Android:id="@Android:id/progress"
Android:gravity="center_vertical|fill_horizontal">
<scale Android:scaleWidth="100%">
<shape Android:shape="rectangle"
Android:tint="?attr/colorControlActivated">
<corners Android:radius="8dp"/>
<size Android:height="20dp" />
<solid Android:color="#b9f6ca" />
</shape>
</scale>
</item>
</layer-list>
Personnalisation de la barre de progression indéterminée
Au-dessous de xml, vous trouverez une ressource utilisable pour la personnalisation de la barre de progression circulaire.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@Android:id/progress"
Android:top="16dp"
Android:bottom="16dp">
<rotate
Android:fromDegrees="45"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toDegrees="315">
<shape Android:shape="rectangle">
<size
Android:width="80dp"
Android:height="80dp" />
<stroke
Android:width="6dp"
Android:color="#b71c1c" />
</shape>
</rotate>
</item>
</layer-list>
Créer une barre de progression personnalisée comme Hotstar.
activity_main.xml
<ProgressBar
style="?android:attr/progressBarStyleLarge"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_centerHorizontal="true"
Android:id="@+id/player_progressbar"
Android:indeterminateDrawable="@drawable/custom_progress_bar"
/>
custom_progress_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="2000"
Android:fromDegrees="0"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toDegrees="1080" >
<shape
Android:innerRadius="35dp"
Android:shape="ring"
Android:thickness="3dp"
Android:useLevel="false" >
<size
Android:height="80dp"
Android:width="80dp" />
<gradient
Android:centerColor="#80b7b4b2"
Android:centerY="0.5"
Android:endColor="#f4eef0"
Android:startColor="#00938c87"
Android:type="sweep"
Android:useLevel="false" />
</shape>
</rotate>
Le moyen le plus simple de créer une barre de progression sous Android:
Initialiser et afficher le dialogue:
MyProgressDialog progressdialog = new MyProgressDialog(getActivity());
progressdialog.show();
Créer une méthode:
public class MyProgressDialog extends AlertDialog {
public MyProgressDialog(Context context) {
super(context);
getWindow().setBackgroundDrawable(new ColorDrawable(Android.graphics.Color.TRANSPARENT));
}
@Override
public void show() {
super.show();
setContentView(R.layout.dialog_progress);
}
}
Créer une mise en page 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:background="@Android:color/transparent"
Android:clickable="true">
<RelativeLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true">
<ProgressBar
Android:id="@+id/progressbarr"
Android:layout_width="@dimen/eightfive"
Android:layout_height="@dimen/eightfive"
Android:layout_centerInParent="true"
Android:indeterminateDrawable="@drawable/progresscustombg" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_below="@+id/progressbarr"
Android:layout_marginTop="@dimen/_3sdp"
Android:textColor="@color/white"
Android:text="Please wait"/>
</RelativeLayout>
</RelativeLayout>
Créez la forme progresscustombg.xml et mettez res/drawable:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromDegrees="0"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toDegrees="360" >
<shape
Android:innerRadiusRatio="3"
Android:shape="ring"
Android:thicknessRatio="20"
Android:useLevel="false" >
<size
Android:height="@dimen/eightfive"
Android:width="@dimen/eightfive" />
<gradient
Android:centerY="0.50"
Android:endColor="@color/color_green_icash"
Android:startColor="#FFFFFF"
Android:type="sweep"
Android:useLevel="false" />
</shape>
</rotate>
Pour utiliser des dessins personnalisés:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromDegrees="0"
Android:toDegrees="360"
Android:drawable="@drawable/my_drawable"
Android:pivotX="50%"
Android:pivotY="50%" />
(ajouter sous res/drawable progress.xml
). my_drawable
peut être xml, png
Ensuite, dans votre mise en page, utilisez
<ProgressBar
Android:id="@+id/progressBar"
Android:indeterminateDrawable="@drawable/progress_circle"
...
/>
Si vous voulez faire cela dans le code, voici un exemple:
pd = new ProgressDialog(MainActivity.this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
pd.getWindow().setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
TextView tv = new TextView(this);
tv.setTextColor(Color.WHITE);
tv.setTextSize(20);
tv.setText("Waiting...");
pd.setCustomTitle(tv);
pd.setIndeterminate(true);
pd.show();
L'utilisation de TextView vous permet de modifier la couleur, la taille et la police de votre texte. Sinon, vous pouvez simplement appeler setMessage (), comme d'habitude.