Программное изменение элемента экрана во время его анимации
Привет! Есть метод flipCard, который вращает при обращении к нему кнопку вокруг y-оси то в одну, то в другую сторону с заданной в setDuration() скоростью (Анимация выглядит так). Я зациклил этот процесс с помощью TimerTask.
Требуется сделать так, чтобы при каждом повороте кнопки текст кнопки менялся на рандомный, т.е. на каждой стороне при каждом повороте должен быть новый текст, а сам процесс смены текста должен быть незаметен пользователю. Использовал класс Random и метод setText(), вставлял это дело в applyTransformation перед и после fromView.setVisibility(View.GONE), но текст меняется очень быстро несколько раз подряд на каждой стороне. В других местах (runOnUiThread, flipCard и FlipAnimation) тоже пробовал вставлять, там текст меняется по одному разу на каждой стороне, но происходит это перед вращением кнопки, поэтому процесс смены текста заметен.
Подскажите, как можно решить такую задачу?
//...создание потока через TimerTask...
runOnUiThread(new Runnable() {
@Override
public void run() {
flipCard(rootLayout, cardFace, cardBack);
}
});
private void flipCard (View rootLayout, Button cardFace, Button cardBack)
{
FlipAnimation flipAnimation1 = new FlipAnimation(cardFace, cardBack);
if (cardFace.getVisibility() == View.GONE)
{
flipAnimation1.reverse();
}
rootLayout.startAnimation(flipAnimation1);
}
public class FlipAnimation extends Animation {
private Camera camera;
private Button fromView;
private Button toView;
private float centerX;
private float centerY;
private boolean forward = true;
/* Тут создается анимация между 2 View.
*
* fromView - одна сторона кнопки.
* toView - другая сторона кнопки.
*/
public FlipAnimation(Button fromView, Button toView) {
this.fromView = fromView;
this.toView = toView;
setDuration(1000);
setFillAfter(false);
setInterpolator(new AccelerateDecelerateInterpolator());
}
public void reverse() {
forward = false;
Button switchView = toView;
toView = fromView;
fromView = switchView;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
centerX = width / 2;
centerY = height / 2;
camera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// Расчет угла поворота:
final double radians = Math.PI * interpolatedTime;
float degrees = (float) (180.0 * radians / Math.PI);
/* При повороте кнопки ребром к наблюдателю один View исчезает,
* а другой появляется; вместе с этим меняются градусы.
*/
if (interpolatedTime >= 0.5f) {
degrees -= 180.f;
fromView.setVisibility(View.GONE);
toView.setVisibility(View.VISIBLE);
}
if (forward)
degrees = -degrees; //определение направления движения при начале поворота
final Matrix matrix = t.getMatrix();
camera.save();
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}