Как создать эффект подсчета для 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());
}
}
Я уверен, что это оба совершенно любительские попытки. Любая помощь будет очень оценена.
Спасибо,
Ричард
Ответы
Ответ 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();
}
}