Android - Laggy фрагмент перехода с полным HD-дисплеем

У меня есть простой анимированный переход фрагмента в разделе входа в систему моего приложения - см. anim.xml . Фрагменты имеют фоновый набор из drawables в xml, и все работает нормально, если я не протестирую его на своем смартфоне с полным HD-дисплеем. Переход вдруг становится запаздывающим. Кто-нибудь знает, что может быть причиной этого? Оба фона имеют разрешение 1080*1920.

anim.xml - пример анимации (по 4 с каждой стороны для анимации входа и выхода)

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="250"/>
</set>

3 ответа

Решение

Несколько лет опыта спустя - поместите ваше изображение в drawable-nodpi

nodpi

Это независимые от плотности ресурсы. Система не масштабирует ресурсы, помеченные этим классификатором, независимо от плотности текущего экрана.

В чем разница между -anydpi и -nodpi?

Мне кажется, у вас проблемы с производительностью (возможно, с графическим процессором, может быть, у вас есть оверрейд). Я не знаю, в чем причина этого, но есть множество инструментов, которые могут помочь вам лучше понять, что происходит. Посмотрите на эту статью http://www.curious-creature.com/docs/android-performance-case-study-1.html

Также могут быть полезны видео с примерами производительности Android. Я настоятельно рекомендую посмотреть это:

Инструмент - рендеринг профиля GPU https://www.youtube.com/watch?v=VzYkVL1n4M8

Overdraw https://www.youtube.com/watch?v=T52v50r-JfE

Пользовательский интерфейс и графический процессор https://www.youtube.com/watch?v=WH9AFhgwmDw

Почему 60 мс https://www.youtube.com/watch?v=CaMTIgxCSqU

Ну, после некоторого времени (долгого времени) попытки решить эту проблему, единственное решение моей проблемы состояло в том, чтобы изменить фоновое изображение непосредственно перед транзакцией Fragment на некоторое изображение с низким разрешением и проверить конец анимации, чтобы изменить его обратно на изображение с высоким разрешением. Уродливо, но по крайней мере это работает.

Хотя, если вы пойдете по этому пути в будущем, ожидайте некоторые проблемы с определением конца анимации. Фрагменты имеют метод onCreateAnimation, где вы можете добавить AnimationListener, который имеет методы для обнаружения начала, повтора и конца анимации, но имеет ошибочное поведение, обнаруживающее конец анимации. Обратный вызов запускается незадолго до завершения анимации, что делает вашу транзакцию фрагмента запаздывающей, так как она вот-вот закончится (в моем случае это были последние десять пикселей или около того).

Решил это очень уродливо - реализовал CountDownTimer для 10 мс в конце анимации и изменил фон на высокое разрешение после окончания таймера.

Кроме того, onCreateAnimation Fragment имеет минимальную документацию, поэтому вы не будете знать, каковы ее параметры, я нашел эту азиатскую веб-страницу, которая помогла мне понять это.
http://y-anz-m.blogspot.cz/2013/05/support-package-fragmenttransaction.html

Во всяком случае, я не знаю, как работает фон FragmentTransaction, но спасибо Google, за такую ​​замечательную реализацию FragmentTransactions и AnimationListeners.

Другие вопросы по тегам