Почему моя анимация оставляет след? - PullRequest
9 голосов
/ 19 июня 2009

Я анимирую ImageView слева направо от экрана, используя анимацию перевода. ImageView находится внутри RelativeLayout поверх моего основного макета, используя FrameLayout.

Когда я запускаю анимацию на эмуляторе, все работает довольно хорошо, но когда я использую запустить ее на моем G1, он оставляет визуальные артефакты позади и влияет на визуализацию текстового компонента позади него.

Это проблема с производительностью, и я слишком амбициозен, или это ошибка, которую я могу преодолеть?

Если это проблема с производительностью, могу ли я что-то улучшить?

Ответы [ 8 ]

10 голосов
/ 17 февраля 2012

У меня тоже была такая же проблема на 2.3.

В Animation.applyTransformation исправлен контейнер с движущимся видом (компоновка, в которой находится движущийся вид).

См:

Android - артефакты с использованием анимации

3 голосов
/ 29 июня 2010

Я сейчас это может быть немного стар, но я только что нашел это:

http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation+leaves+trails#e750730b9953d9a8

Не уверен, какую версию Android вы используете, но это может быть ошибка в библиотеках Android!

Похоже, вот в чем проблема для меня! :)

... Донтча, просто люби, когда это не твоя вина! : D

2 голосов
/ 02 марта 2012

Вот обходной путь, который я нашел, который решил это для меня: «Легким обходным решением было бы заполнить ваше изображение небольшой (1 пиксель должен сделать это) прозрачной областью справа / снизу - это не повлияло бы на то, как оно будет выглядеть, но это приведет к аннулированию области, немного большей, чем фактическое изображение, и, таким образом, компенсирует ошибку. "

http://code.google.com/p/android/issues/detail?id=22151

0 голосов
/ 18 марта 2013

Я понял это на бобе желе, которое я испытал в виде галереи, выполняя некоторую анимацию. Это больше похоже на рисунок, а не на процессор ....

заставьте вашу деятельность реализовать интерфейс AnimatorListener ..... переопределите приведенный ниже метод и выберите, какой метод вы хотите перерисовать в

 @Override
public void onAnimationEnd(Animator animation) {
    // TODO Auto-generated method stub

    mView.requestLayout();
    Toast.makeText(this, "animation ended", 0).show();
}

@Override
public void onAnimationRepeat(Animator animation) {
    // TODO Auto-generated method stub
    mView.requestLayout();
}

@Override
public void onAnimationStart(Animator animation) {
    // TODO Auto-generated method stub
    mView.requestLayout();
}
0 голосов
/ 01 августа 2011

У меня была похожая проблема на Android 2.3, поэтому ошибка может существовать. Я использовал ImageView с PNG, который имел несколько прозрачных частей. Это изображение оставляло следы при анимации с TranslateAnimation. Использование поддельного фона для рисования для просмотра изображений облегчило след (я использовал рисование в качестве фона).

0 голосов
/ 10 июля 2010

Это происходит и со мной. Я использую эмулятор, использующий 1.6 с API Google, и я только что подтвердил, что это происходит на Nexus One с FRF83. Вот соответствующий код:

Animation a = new TranslateAnimation(0.0f, 0.0f, 100.0f, 0.0f);
a.setDuration(2000);
this.myView.startAnimation(a);

Вот соответствующий код для создания экземпляра представления:

View v = new View(this.getApplication());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 80);
v.setLayoutParams(params);
v.setBackgroundColor(0xFFFF0000);
//
LinearLayout layout = (LinearLayout)this.findViewById(R.id.theLayout);
layout.addView(v);
//
v.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
        // TODO Auto-generated method stub
        doAnimation();
    }
});
//
myView = v;

Таким образом, в основном, двойная буферизация и т. Д. Обрабатывается ОС, и я совершенно не контролирую ее.

0 голосов
/ 25 июня 2009

Я бы предложил использовать SurfaceView для анимации. Он имеет двойную буферизацию, поэтому при правильном использовании он должен исключать мерцание. Если вы хотите пример, демонстрация LunarLander, включенная в SDK, показывает это очень хорошо. Кроме того, если у вас есть более конкретный вопрос с кодом, задайте его.

Что касается общей производительности Android, вполне возможно иметь достаточно высокую частоту кадров, так что вы не ожидаете слишком многого.

0 голосов
/ 19 июня 2009

На самом деле проблема не в том, что вы не очищаете буфер дисплея перед записью следующего кадра. Для меня это не похоже на проблему с производительностью.

У вас есть контроль над тем, выполняет ли устройство двойную буферизацию или нет?

Учитывая, что он работает на эмуляторе, это может указывать либо на проблему с эмулятором, либо на ошибку в вашем коде, которая не отображается на эмуляторе (что, я полагаю, технически является проблемой эмулятора!) проблема с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...