Android TextSwitcher数字序列动画

时间:2012-01-15 12:48:49

标签: android

我想做以下 - 动画编号序列更改,我正在使用TextSwitcher。我有用户得分,它会不时变化。有没有办法对此更改进行动画处理,以便将此数字从其当前值缓慢增加到其结果值?类似http://josheinstein.com/blog/index.php/2010/02/silverlight-animated-turbotax-number-display/但适用于Android。

3 个答案:

答案 0 :(得分:7)

我一直在找同样的,有朋友帮我,这是一份工作样本。希望它适合你。

-Raj

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class TimerUpdateAnimatorActivity extends Activity {

    private static final int toValue = 20;
    private static final int fromValue = 0;
    private static final int FRAME_TIME_MS = 100;
    private static final String KEY = "i";
    private TextView animatedText;
    boolean isRunning = false;

    // background updating
    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            try {
                int i= msg.getData().getInt(KEY);
                animatedText.setText(""+i);

            } catch (Exception err) {
            }
        }

    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        animatedText = (TextView) findViewById(R.id.animatedText);
    }

    public void onStart() {
        super.onStart();
        Thread background = new Thread(new Runnable() {
            public void run() {
                try {
                    for (int i = fromValue; i <= toValue && isRunning; i++) {
                        Thread.sleep(FRAME_TIME_MS);
                        Bundle data= new Bundle();
                        data.putInt(KEY, i);
                        Message message = handler.obtainMessage();
                        message.setData(data);
                        handler.sendMessage(message);
                    }
                }
                catch (Throwable t) {
                }
            }
        });
        isRunning = true;
        background.start();
    }

    public void onStop() {
        super.onStop();
        isRunning = false;
    }

}

答案 1 :(得分:1)

我已经创建了一个类,可以使用您选择的Android Interpolator为数字更改设置动画。这允许您使用与Android中其他动画相同的算法来控制更改速率。例如,您可能更喜欢而不是数值变化以恒定速率动画,数字变化快速开始,然后随着接近最终值而变慢。

您可以阅读有关实施此here的完整文章。

实现此目标的课程的完整来源可作为要点here

使用ValueAnimator类和您选择的Interpolator实现文本值的动画。下面是创建动画师的主代码,并添加侦听器以在动画执行时更新View上的文本。

public void execute(){ 
    mValueAnimator = ValueAnimator.ofFloat(mStartValue, mEndValue); 
    mValueAnimator.setDuration(mDuration); 
    mValueAnimator.setInterpolator(mInterpolator); 
    mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
        public void onAnimationUpdate(ValueAnimator valueAnimator) { 
            float current = Float.valueOf(valueAnimator.getAnimatedValue().toString()); 
            mView.setText(String.format("%." + mPrecision + "f", current)); 
        } 
     });    

    mValueAnimator.start(); 
} 

答案 2 :(得分:0)

我知道这是一个很老的答案,但这是我的2美分。注意,如果oldValue&lt;部分检查/代码应该放置到位。值...

String values[] = new String[Math.abs(oldValue - value)];
int count = 0;
for (int i = oldValue; i < value; i++) {
    values[count++] = "" + i;
}

Animator animatorText = ObjectAnimator.ofObject(new AnimatedTextView(navigationBarBalanceAmountTextView), "Text", new TypeEvaluator<String>() {
    @Override
    public String evaluate(float fraction, String startValue, String endValue) {
        return (fraction < 0.5) ? startValue : endValue;
    }
},  values);    
animatorText.start();