Почему моя анимация оставляет след?

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

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

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

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

Теперь я могу быть немного старым, но я просто нашел это:

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

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

Похоже, это то, что проблема для меня! 🙂

… Dontcha просто нравится, когда это не ваша вина! : D

Я также сталкивался с тем же вопросом в версии 2.3.

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

Видеть:

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

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

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

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

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

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

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

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

Это происходит и со мной. Я использую эмулятор с 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; 

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

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

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

Сделайте свою деятельность реализацией интерфейса 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(); }