Как я могу использовать анимацию со своими объектами?

1

Я хотел бы использовать платформу анимации Android для расчета движения с течением времени. Тем не менее, создаваемые TranslateAnimations всегда показывают, что они закончились в каждом вызове, который я делаю для getTransformation, и Transformation выглядит некорректно. В приведенном ниже коде я ожидаю следующий вывод журнала после запуска void1() и void2():

Первый тест 1:100,0, 1000,0 (true)

Тест 1 через 2,5 секунды: 150,0, 1500,0 (истина)

Тест 2 изначально: 100,0, 1000,0 (true)

Тест 2 через 2,5 секунды: 150,0, 1500,0 (истина)

Вместо этого я получаю этот вывод:

Сначала тест 1:12.0, 34.0 (true)

Тест 1 через 2,5 секунды: 12,0, 34,0 (истина)

Тест 2 изначально: 0.0, 0.0 (true)

Тест 2 через 2,5 секунды: 0.0, 0.0 (true)

void test1() {
        Animation anim = new TranslateAnimation(100, 1000, 200, 2000);
        anim.setFillAfter(true);
        anim.setFillBefore(true);
        anim.setDuration(5000);
        anim.startNow();

        Transformation t = new Transformation();
        boolean hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        float newpts[] = {12, 34};
        t.getMatrix().mapPoints(newpts);
        Log.v("AnimationTest", "Test 1 initially: " + newpts[0] + ", " + newpts[1] + " (" + hasended + ")");

        long target = System.currentTimeMillis() + 2500;
        while (System.currentTimeMillis() < target)
            System.gc();

        hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        t.getMatrix().mapPoints(newpts);
        Log.v("AnimationTest", "Test 1 after 2.5 seconds: " + newpts[0] + ", " + newpts[1] + " (" + hasended + ")");
    }

    void test2() {
        Animation anim = new TranslateAnimation(100, 1000, 200, 2000);
        anim.setFillAfter(true);
        anim.setFillBefore(true);
        anim.setDuration(5000);
        anim.startNow();

        //Based on http://stackoverflow.com/questions/4112599/android-how-to-stop-animation-cancel-does-not-work
        Transformation t = new Transformation();
        boolean hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        Matrix transformationMatrix = t.getMatrix();
        float[] matrixValues = new float[9];
        transformationMatrix.getValues(matrixValues);
        float transX = matrixValues[Matrix.MTRANS_X];
        float transY = matrixValues[Matrix.MTRANS_Y];
        Log.v("AnimationTest", "Test 2 initially: " + transX + ", " + transY + " (" + hasended + ")");

        long target = System.currentTimeMillis() + 2500;
        while (System.currentTimeMillis() < target)
            System.gc();

        hasended = anim.getTransformation(AnimationUtils.currentAnimationTimeMillis(), t);
        transformationMatrix = t.getMatrix();
        transformationMatrix.getValues(matrixValues);
        transX = matrixValues[Matrix.MTRANS_X];
        transY = matrixValues[Matrix.MTRANS_Y];
        Log.v("AnimationTest", "Test 2 after 2.5 seconds: " + transX + ", " + transY + " (" + hasended + ")");
    }

Как я могу получить ожидаемые результаты?

  • 0
    В тесте 1 вы устанавливаете 'newpts [] = {12, 34}'. Как вы ожидаете, что он будет выводить его по-другому, поскольку вы не меняете значения перед инструкциями журнала?
  • 0
    Matrix.mapPoints (newpts) имеет побочные эффекты (пишет в newpts).
Теги:
animation

2 ответа

1
Лучший ответ

Есть две проблемы с вышеприведенным кодом: первая заключается в том, что initialize() необходимо вызвать до того, как TranslateAnimation вернет действительные результаты для getTransformation(). Во-вторых, getTransformation() возвращает, продолжает ли анимация, а не остановлена ​​ли она. После выполнения этих двух изменений код работает по желанию.

0

Не могли бы вы просто implement AnimationListener? Внутри onAnimationEnd() вы можете повторно инициализировать их или что-то еще, что вам нужно сделать между тестированием?

  • 0
    Я мог бы, но я не уверен, как это помогло бы решить проблему (которая решена в другом ответе) - проблема была в том, что Animation.getTransformation всегда указывал бы, что анимация уже закончилась, даже когда она должна была все еще быть собирается. Проблема заключалась в том, что Animation.initialize должен быть вызван перед использованием анимации, и я неверно истолковал возвращаемое значение getTransformation. anim не нуждается в повторной инициализации, потому что это разные объекты в test1 и test2.
  • 0
    @Ben Мои извинения за неправильное толкование, рад, что вы решили это все же.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню