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

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

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

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

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

8 ответов


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

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

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

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

... Разве ты не любишь, когда это не твоя вина? : D


Я также испытывал ту же проблему на 2.3.

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

посмотреть:

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


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

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


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

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

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


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

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


это происходит и со мной. Я использую эмулятор, использующий 1.6 с Google APIs, и я только что подтвердил, что это происходит на 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, который имел некоторые прозрачные части. Этот imageview оставлял следы, когда анимировался с TranslateAnimation. Используя поддельный фон холст для книги elimanated след (я использовал холст в качестве фона).


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

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