Android - мигающий backgroundColor и textColor TextView вместе

Я пытаюсь получить TextView для инвертирования фона и цветов текста с интервалом, заданным переменной, называемой "интервал" (целое значение, представляющее миллисекунды).

В настоящее время я использую ObjectAnimator для каждого свойства, а затем использую объект AnimatorSet для их воспроизведения. Это работает; Однако я не уверен, как избавиться от всех переходных цветов. Мне не нужен плавный переход, просто жесткая вспышка. Я пытался использовать setFrameDelay(интервал) для достижения этой цели, но это не работает.

Я пытался сделать это с отдельным потоком /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 ответ

Вы можете работать с 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);
    }
}

}

Другие вопросы по тегам