Программное изменение элемента экрана во время его анимации

Рейтинг: 2Ответов: 1Опубликовано: 30.04.2015

Привет! Есть метод 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);
    }
}

Ответы

Ответов пока нет.