Почему view.startAnimation (animation) не работает при вызове из события? - PullRequest
7 голосов
/ 29 сентября 2011

Я создал собственное представление, которое использует фиктивную TranslateAnimation для настройки некоторых свойств макета.Я использую Интерполятор для вычисления высоты и применяю его к представлению внутри метода applyTransformation () TranslateAnimation.

Это работает очень хорошо, если я запускаю анимацию из своей Деятельности.*

Когда я пытаюсь сделать то же самое, используя сенсорное событие, ничего не происходит.

@Override
// This method is touch handler of the View itself
public boolean onTouch(View v, MotionEvent event) {
    Log.i("test", "onTouch()");
    this.expand(); // onTouch is part of the view itself and calls expand() directly
    return true;
}

Мой метод расширения выглядит следующим образом:

public void expand() {
    Log.i("test", "Expand!");

    TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 0) {

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            Log.i("test", "applyTransformation()");

            super.applyTransformation(interpolatedTime, t);

            // do something
        }

    };
    anim.setDuration(500);
    anim.setInterpolator(new AccelerateDecelerateInterpolator());
    this.someInternalView.startAnimation(anim);
}

После создания моей активности Logcatпоказывает "onCreate ()" Внутри моего события касания Logcat показывает "onTouch ()" Внутри метода expand () Logcat показывает "Развернуть!"- либо вызывается из действия, либо из события.

Внутри метода applyTransformation () Logcat показывает «applyTransformation ()» - НО!только если метод expand () вызывается из onCreate ().Любая попытка запустить анимацию с события не удалась.

Это выглядит как проблема с многопоточностью.Может ли это быть?Есть ли что-то, что я пропускаю?Насколько я вижу из других постов, запуск анимации с событий должен работать без проблем ...

Заранее спасибо!

1 Ответ

1 голос
/ 21 апреля 2014

попробуйте это:

public void expand() {
    Log.i("test", "Expand!");
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 0) {

                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    Log.i("test", "applyTransformation()");

                    super.applyTransformation(interpolatedTime, t);

                        // do something
                    }

                };
                anim.setDuration(500);
                anim.setInterpolator(new AccelerateDecelerateInterpolator());
                this.someInternalView.startAnimation(anim); 
            }
        });
    }
...