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