Подтвердить что ты не робот

Как создать эффект подсчета для textView в Android

Я работаю над приложением, которое подсчитывает количество вопросительных знаков в нескольких абзацах текста.

После того, как сканирование будет выполнено (на это не хватает времени), мне бы хотелось, чтобы общее количество отображалось после того, как число от 0 до TOTAL. Итак, для 10: 0,1,2,3,4,5,6,7,8,9 10, а затем STOP.

Я пробовал несколько разных приемов:

                TextView sentScore = (TextView) findViewById(R.id.sentScore);

                long freezeTime = SystemClock.uptimeMillis();

                for (int i = 0; i < sent; i++) {
                    if ((SystemClock.uptimeMillis() - freezeTime) > 500) {
                        sentScore.setText(sent.toString());
                    }
                }

Также я пробовал это:

    for (int i = 0; i < sent; i++) { 
        // try {
            Thread.sleep(500);

        } catch (InterruptedException ie) {
            sentScore.setText(i.toString()); 
        } 
    }

Я уверен, что это оба совершенно любительские попытки. Любая помощь будет очень оценена.

Спасибо,

Ричард

4b9b3361

Ответ 1

Попробуйте следующее:

private int counter = 0;
private int total = 30; // the total number
//...
//when you want to start the counting start the thread bellow.
    new Thread(new Runnable() {

                public void run() {
                    while (counter < total) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        t.post(new Runnable() {

                            public void run() {
                                t.setText("" + counter);

                            }

                        });
                        counter++;
                    }

                }

            }).start();

Ответ 2

Я использовал для этого более обычную анимацию в стиле Android:

        ValueAnimator animator = new ValueAnimator();
        animator.setObjectValues(0, count);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator animation) {
                view.setText(String.valueOf(animation.getAnimatedValue()));
            }
        });
        animator.setEvaluator(new TypeEvaluator<Integer>() {
            public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
                return Math.round(startValue + (endValue - startValue) * fraction);
            }
        });
        animator.setDuration(1000);
        animator.start();

Вы можете играть со значениями 0 и count, чтобы счетчик переходил от любого числа к любому номеру и воспроизводил с помощью 1000 для установки продолжительности всей анимации.

Обратите внимание, что это поддерживает Android API уровня 11 и выше, но вы можете использовать awesome nineoldandroids проект, чтобы сделать его обратно совместимым.

Ответ 3

Используйте TextSitcher

для наилучшего эффекта. Он будет мягко трансформировать текст.

При переходе к изменению текста используйте приведенный ниже код.

> int number = 0;
>         Timer obj = new Timer();
>         TimerTask tt = new TimerTask() {
>                       @Override           public void run() {
>               // TODO Auto-generated method stub
>               textView.setText(number++);
>               if(number < score)
>               obj.schedule(tt, 200);          }       };
>         obj.schedule(tt, 200);

Ответ 4

Используйте рабочий поток, чтобы выполнить ожидание и обновить поток пользовательского интерфейса.

Вы можете использовать AsyncTask, хотя это может быть излишним для этой работы. Если вы используете это, в цикле doInBackground() над количеством периодов сна и после каждого периода ожидания обновите счет в UIthread.

Иди сюда! Slukain просто дал вам рабочий код: P

Ответ 5

Возможно, попробуйте изменить цикл for на что-то вроде:

int count = 0;
while (count != sent) {
    if ((SystemClock.uptimeMillis() - freezeTime) > 500) {
        count++;
        sentScore.setText("" + count);
        freezeTime = SystemClock.uptimeMillis();
    }
}