Animer ProgressBar mise à jour en Android
Je suis en utilisant une Barre de ma candidature qui je l'ai mise à jour en onProgressUpdate d'un AsyncTask
. So far So good.
Ce que je veux faire est d'animer la mise à jour des progrès, afin de ne pas "sauter" sur la valeur, mais en douceur se déplace à elle.
J'ai essayé de le faire exécuter le code suivant:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
while (progressBar.getProgress() < progress) {
progressBar.incrementProgressBy(1);
progressBar.invalidate();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
Le problème est que la barre de progression n'est pas de mise à jour de son état jusqu'à ce qu'il fini sa valeur finale (progrès de la variable). Tous les états entre les deux ne sont pas affichées sur l'écran. L'appel de la progressBar.invalidate() n'a pas aidé non plus.
Des idées? Merci!
InformationsquelleAutor user1033552 | 2011-11-07
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé android Animation de ce:
et de l'appeler de la sorte:
Remarque: si, à partir de et pour la valeur est trop faible pour produire une animation fluide il suffit de multiplier par 100. Si vous le faites, n'oubliez pas de multiplier setMax(..) ainsi.
interpolatedTime
est la valeur passée àsetDuration()
applyTransformation()
sauvé ma journée! Merci une tonne.progressBar.setSecondaryProgress((int)value);
au lieu deprogressBar.setProgress((int) value);
- Je utiliser un ObjectAnimator
La façon la plus simple, à l'aide de ObjectAnimator:
où
progressValue
est entier compris dans la gamme de 0 à 100 (la limite supérieure est fixée à 100 par défaut mais vous pouvez la changer avec Progressbar#setMax() méthode)Vous pouvez également modifier la façon dont les valeurs sont modifiées par la mise en différents interpolateur avec setInterpolator() méthode. Voici la visualisation de différents interpolateurs: https://www.youtube.com/watch?v=6UL7PXdJ6-E
Ici est une version améliorée de @Eli Konky solution:
Et utilisation:
Android a pris soin de cela pour vous
android:animationResolution = "timeInMilliseconds"
dans votre .fichier xmlUn Kotlin façon de le faire
EDIT: Tandis que ma réponse œuvres, Eli Konkys réponse est mieux. L'utiliser.
si votre thread s'exécute sur le thread de l'INTERFACE utilisateur, ensuite, il faut remettre le thread de l'INTERFACE utilisateur de donner le point de vue d'une chance de le mettre à jour. Actuellement, vous dites que la barre de progression "mise à jour 1, jour 2, jour 3" sans jamais relâcher l'UI thread, donc il peut effectivement mettre à jour.
La meilleure façon de résoudre ce problème est d'utiliser Asynctask, il a des méthodes indigènes qui fonctionne à la fois sur et hors du thread d'INTERFACE utilisateur:
AsyncTask peut sembler compliqué au premier abord, mais il est vraiment efficace pour de nombreuses tâches différentes, ou comme spécifié dans l'API Android:
Vous pouvez essayer d'utiliser un gestionnaire /praticable à la place...
Ici est une version améliorée d'un.ch. la solution, où vous pouvez également utiliser la rotation de la circulaire de la ProgressBar. Parfois, il est nécessaire de définir une démarche constante de progrès et de changer seulement la rotation ou même les deux d'avancement et de rotation. Il est également possible de forcer des aiguilles d'une montre ou dans le sens antihoraire rotation. J'espère que ça aidera.
Utilisation: