Почему моя анимация оставляет след?
Я анимирую ImageView слева направо от экрана, используя анимацию перевода. ImageView находится внутри RelativeLayout поверх моего основного макета с помощью FrameLayout.
когда я запускаю анимацию на эмуляторе, все работает довольно хорошо, но когда я использую его на своем G1, он оставляет визуальные артефакты и влияет на рендеринг текстового компонента.
Это проблема производительности, и я слишком амбициозен или это ошибка, которую я могу преодолеть?
Если это проблема производительности, есть ли что-нибудь, что я могу сделать, чтобы улучшить ситуацию?
8 ответов
Я теперь это может быть немного старый, но я только что нашел это:
Не уверен, какую версию android вы используете, но это может быть ошибка в библиотеках android!
похоже, что это проблема для меня! :)
... Разве ты не любишь, когда это не твоя вина? : D
Я также испытывал ту же проблему на 2.3.
аннулирование контейнера движущегося вида ( макета, в котором находится движущийся вид ) в анимации.applyTransformation исправила это для меня.
посмотреть:
вот обходной путь, который я нашел, что решил это для меня: "легким обходным путем было бы поместить ваше изображение с небольшой (1 пиксель должен сделать это) прозрачной областью справа/внизу - это не повлияло бы на то, как это будет выглядеть, но это заставило бы недействительность области немного больше, чем фактическое изображение, и таким образом компенсировать ошибку."
фактически не видя проблемы, звучит так, как будто вы не очищаете буфер дисплея перед написанием следующего кадра. Это не похоже на проблему производительности для меня.
У вас есть контроль над тем, выполняет ли устройство двойную буферизацию или нет?
учитывая, что он работает на эмуляторе, это может указывать либо на проблему с эмулятором, либо на ошибку в вашем коде, которая не отображается на эмуляторе (что, я полагаю, технически является проблемой эмулятор!) вместо проблемы производительности.
Я бы предложил использовать 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();
}