Android - 将TextView的backgroundColor和textColor一起闪烁

时间:2016-08-30 00:54:34

标签: android textview objectanimator animatorset

我试图让TextView以一个名为" interval"的变量指定的间隔反转背景和文本颜色。 (表示毫秒的整数值)。

目前,我正在为每个属性使用ObjectAnimator,然后使用AnimatorSet对象将它们一起播放。这有效;但是,我不确定如何摆脱所有的过渡色。我不需要平稳过渡,只需要一个坚硬的闪光。我尝试使用setFrameDelay(interval)来完成此任务,但这不起作用。

我曾经尝试过使用单独的线程/ runnable,但是我一直在遇到需要在执行其他操作之前停止线程的问题。我无法让新动作可靠地等待线程停止,所以当时机不正确时,我最终会得到奇怪的背景和文本叠加。使用Android的动画框架似乎更适合轻松启动和停止。

以下是与我合作的代码:

ObjectAnimator backgroundColorValueAnimator = ObjectAnimator.ofInt(
            textView,
            "backgroundColor",
            Color.BLACK,
            Color.parseColor(globalSettings.color)
    );
    ObjectAnimator textColorValueAnimator = ObjectAnimator.ofInt(
            textView,
            "textColor",
            Color.parseColor(globalSettings.color),
            Color.BLACK
    );
    backgroundColorValueAnimator.setFrameDelay(interval);
    textColorValueAnimator.setFrameDelay(interval);
    backgroundColorValueAnimator.setRepeatCount(ObjectAnimator.INFINITE);
    backgroundColorValueAnimator.setRepeatMode(ObjectAnimator.RESTART);
    textColorValueAnimator.setRepeatCount(ObjectAnimator.INFINITE);
    textColorValueAnimator.setRepeatMode(ObjectAnimator.RESTART);
    globalSettings.invertBackground = new AnimatorSet();
    globalSettings.invertBackground.play(backgroundColorValueAnimator).with(textColorValueAnimator);
    globalSettings.invertBackground.setDuration(interval);
    globalSettings.invertBackground.start();

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用ValueAnimator进行倒计时和自定义ValueAnimator.AnimatorUpdateListener

ValueAnimator myColorAnimator;
MyColorUpdateListener myColorUpdateListener;
int interval = 2000;

@Override
public void onCreate(Bundle savedState){
    TextView textView = (TextView) findViewById(R.id.textView);

    myColorAnimator = ValueAnimator.ofObject(new IntEvaluator(), 0, 2 * interval);
    myColorAnimator.setDuration(2 * interval);
    myColorUpdateListener = new MyColorUpdateListener(textView, Color.BLACK, Color.parseColor(globalSettings.color), interval );
    myColorAnimator.addUpdateListener(myColorUpdateListener);

    myColorAnimator.setInterpolator(new LinearInterpolator());
    myColorAnimator.setRepeatCount(ObjectAnimator.INFINITE);
    myColorAnimator.setRepeatMode(ObjectAnimator.RESTART);
    myColorAnimator.start();        
}

自定义ValueAnimator.AnimatorUpdateListener的代码:

public class MyColorUpdateListener implements ValueAnimator.AnimatorUpdateListener {

private TextView textView;
private int colorText, colorBackground, interval;

MyColorUpdateListener(TextView tv, int colorBg, int colorText, int interval) {
    this.textView = tv;
    this.colorText = colorText;
    this.colorBackground = colorBg;
    this.interval = interval;
}

@Override
public void onAnimationUpdate(ValueAnimator animation) {
    Object o = animation.getAnimatedValue();
    int counter = (int)o;

    if (counter == 0)
    {
        textView.setBackgroundColor(colorBackground);
        textView.setTextColor(colorText);
    }
    else if (counter == interval)
    {
        textView.setBackgroundColor(colorText);
        textView.setTextColor(colorBackground);
    }
}

}