2009-06-18 3 views
9

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

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

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

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

+4

Можете ли вы предоставить какой-либо код для нас? Вы делаете что-нибудь еще с рамкой? Какую версию SDK вы используете (например, cupcake?) – jamesh

+0

Это класс, который вы используете? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html –

+0

Хороший вопрос, у меня тоже была эта проблема, но она тоже отображается в эмуляторе! Это происходит, когда я оживляю 3D-поворот представления в FrameLayout, возможно, это функция/ошибка FrameLayout? Я посмотрю, могу ли я использовать поверхностный вид ... – Andy

ответ

3

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

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

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

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

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

+0

Почти наверняка. Больше нет кода для повторного тестирования :(Я отказался от этой анимации и пошел с той, которая не оставила бы след. –

0

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

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

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

+0

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

+0

@Tom - Я думаю, что я достиг предела того, что могу предложить. Я действительно не знаю среду, в которой вы работаете, но я знаю, что анимация работала с 3D-графикой реального времени в течение ряда лет, и я столкнулся с подобными проблемами звучания. Но, как я уже сказал, не видя, что происходит, трудно диагностировать проблему. – ChrisF

0

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

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

0

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

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

10

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

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

См:

Android - Artifacts using Animation

+0

Спасибо за сообщение альтернативного решения этого старого вопроса Matthijs ... –

+0

Вы только что спасли мой день Спасибо! –

2

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

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

+0

Далеко это самое простое решение. Благодаря! –

+0

этот одно работает. не знаю, почему это происходит, поскольку один из главных разработчиков Android написал, что он был установлен несколько лет назад: http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation + листья + тропы # e750730b9953d9a8 –

+0

Очень интересно! Я предполагаю, что это работает из-за перехода от фактических к плотности независимых пикселей. Кольцо невидимого объясняет некоторую неряшливость. –

0

Я понял это на 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(); 
} 
Смежные вопросы