如何为Android中的textView创建计数效果

时间:2012-03-16 12:08:04

标签: java android android-layout

我正在开发一款应用程序,用于计算几段文字中的问号数量。

扫描完成后(根本没有时间)我希望在数字从0到TOTAL之后显示总数。所以,对于10:0,1,2,3,4,5,6,7,8,9 10 然后停止。

我尝试了几种不同的技术:

                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()); 
        } 
    }

我确信这些都是业余尝试。任何帮助都会受到高度赞赏。

谢谢,

理查德

6 个答案:

答案 0 :(得分:55)

我使用了更传统的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();

您可以使用0count值来使计数器从任意数字变为任意数字,并使用1000来设置整个动画的持续时间。

请注意,这支持Android API等级11及更高版本,但您可以使用强大的nineoldandroids项目轻松向后兼容。

答案 1 :(得分:10)

试试这个:

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 :(得分:2)

使用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);

答案 3 :(得分:1)

使用工作线程进行等待并更新UI线程。

你可以使用AsyncTask,虽然这可能对这项工作来说太过分了。如果你使用它,在睡眠周期数和每个睡眠周期后的doInBackground()循环中,更新UIthread中的计数。

你去吧! Slukain刚刚给了你工作代码:P

答案 4 :(得分:1)

这个问题很老了,但是我发布这个是为了对别人有帮助。 我已经使用了这2个惊人的库。

尝试一下

  1. https://github.com/MasayukiSuda/CountAnimationTextView

Sample Effect

或 2. https://github.com/robinhood/ticker

Sample effect of 2nd library

希望这会有所帮助:)编码愉快!

答案 5 :(得分:0)

也许尝试将for循环更改为:

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