2 votes

Comment animer un texte dans Android ?

Dans mon application Android, j'essaie d'afficher un texte "Loading..." qui changera toutes les 100 ms. Après chaque 100 millisecondes, il augmentera d'un point. Ainsi, le texte sera d'abord "Chargement.", puis après 100 ms, il sera "Chargement...". Lorsque le texte sera "Chargement..." ce processus s'arrêtera et recommencera à partir du premier mot. Il se poursuivra jusqu'à 3500 ms. Cela ressemblera à une barre de progression.

J'espère que j'ai pu expliquer le problème.

Comment résoudre ce problème ? Merci de m'aider.

5voto

Rajkiran Points 2354

Ce n'est pas la meilleure réponse, mais elle fonctionne.

    Handler handler = new Handler();

    for (int i = 100; i <= 3500; i=i+100) {
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                if(i%300 == 0){
                    textView.setText("Loading.");
                }else if(i%200 == 0){
                    textView.setText("Loading..");
                }else if(i%100 == 0){
                    textView.setText("Loading...");
                }
            }
        }, i);
    }

4voto

Madhur Points 2710

Extrait de Kotlin pour l'animation (chargement...) :

ValueAnimator.ofInt(0, 4).apply {
        repeatCount = 10
        duration = 1000
        addUpdateListener { valueAnimator ->
                val dotsCount = valueAnimator.getAnimatedValue() as Int
                if (dotsCount < 4) {
                    spannable.setSpan(transparentColorSpan, 7 + dotsCount, 10,
                                  Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                    textView.invalidate()
                }
      }
}.start()

3voto

MByD Points 78505

A CountdownTimer semble convenir, modifiez le texte dans onTick.

0voto

jsimpson Points 381

Vous devez utiliser une tâche asynchrone. Cette classe est destinée aux tâches d'arrière-plan de longue durée qui publient des mises à jour et s'exécutent automatiquement sur le fil d'exécution de l'interface utilisateur.

En doInBackground et vous avez votre boucle qui appellera alors publishProgress qui appellera onProgressUpdate toutes les 100 ms avec les nouvelles valeurs.

Cela se fera en arrière-plan et onProgressUpdate s'exécutera automatiquement sur le thread de l'interface utilisateur.

Quelque chose comme.. :

private class ShowLoading extends AsyncTask<Void, Integer, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        for (int i = 0; i < 3500; i++){
            publishProgress(i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);

        if (values[0]%3 == 0){
            textview.setText ("Loading.");
        } else if (values[0]%3 == 1){
            textview.setText ("Loading..");
        } else if (values[0]%3 == 2){
            textview.setText ("Loading..");
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X