Я анимация ImageView слева от экрана, используя анимацию перевода. ImageView находится внутри RelativeLayout поверх моей основной компоновки с использованием FrameLayout.
Когда я запускаю анимацию на эмуляторе, все работает очень хорошо, но когда я использую запустить ее на своем G1, она оставляет визуальные артефакты позади и влияет на рендеринг текстового компонента позади него.
Является ли это проблемой производительности, и я слишком амбициозен или это ошибка, которую я могу преодолеть?
Если это проблема производительности, я могу что-то сделать, чтобы улучшить ситуацию?
Теперь я могу быть немного старым, но я просто нашел это:
Не знаете, какую версию для Android вы используете, но это может быть ошибка в андроидных библиотеках!
Похоже, это то, что проблема для меня! 🙂
… Dontcha просто нравится, когда это не ваша вина! : D
Я также сталкивался с тем же вопросом в версии 2.3.
Недействительность контейнера перемещаемого вида (расположение, в котором находится движущийся вид) в Animation.applyTransformation исправила его для меня.
Видеть:
Android – артефакты с использованием анимации
Вот обходной путь, который я нашел, который решил это для меня: «Простым обходным решением было бы поместить свое изображение с небольшой (1 пиксель должен сделать это) прозрачной областью справа / снизу – это не повлияло бы на то, как это будет выглядеть, Но это приведет к аннулированию региона, немного большего, чем фактическое изображение, и, таким образом, компенсирует ошибку ».
Если вы не видите проблему, это звучит так, будто вы не очищаете буфер отображения перед написанием следующего кадра. Для меня это не похоже на проблему с производительностью.
У вас есть контроль над тем, работает ли устройство двойной буферизацией или нет?
Учитывая, что он работает на эмуляторе, это может указывать либо на проблему с эмулятором, либо на ошибку в коде, который не отображается на эмуляторе (который, я полагаю, является технически проблемой с эмулятором!), А не проблема с производительностью ,
Я бы предложил использовать 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(); }