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
Это независимые от плотности ресурсы. Система не масштабирует ресурсы, помеченные этим классификатором, независимо от плотности текущего экрана.
Мне кажется, у вас проблемы с производительностью (возможно, с графическим процессором, может быть, у вас есть оверрейд). Я не знаю, в чем причина этого, но есть множество инструментов, которые могут помочь вам лучше понять, что происходит. Посмотрите на эту статью 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.