Android: Как предотвратить задержку или пропуск анимации при транзакции фрагмента при накачивании RecyclerView внутри? - PullRequest
1 голос
/ 06 февраля 2020

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

Очень интригующе то, что все мои выборки и вычисления данных в этом фрагменте выполняются полностью асинхронно c с использованием сопрограмм, установленных в вычислительных потоках. И списки массивов, содержащие данные, даже не длинные или имеют много параметров. Единственное, что я делаю на UI thead, - это установить окончательный список на адаптере RecyclerView и notifyDataSetChanged () -> вот и все! Таким образом, мой вывод заключается в том, что именно инфляция ViewHolder является причиной задержки. XML-макеты для ViewHolders также очень легкие (рисуемое разрешение и три строки).

В терминах транзакций фрагментов я заменяю текущий фрагмент новым в моем FrameLayout и фиксирую, используя собственный набор XML объектные аниматоры.

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

Возможно ли это даже на Android? Я не фанат яблок, но с точки зрения анимации и плавности, устройства iOS терпят крушение c в беспорядке, который Android в этой теме.

Мне нужны какие-либо советы или даже примеры, чтобы показать мне, как решить эту проблему.

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте добавить startOffset (например, 300 мс), когда добавляете / заменяете фрагмент, фрагмент предварительно загружается из фона, через 300 мс приложение запускает анимацию, показывающую ваш фрагмент плавно.

300 мс - это просто случайный число, это действительно зависит от того, насколько тяжелый пользовательский интерфейс нужно инициализировать.

Надеюсь, что эта помощь.

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="400"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        />
    <translate
        android:startOffset="300"
        android:fromYDelta="100%"
        android:toYDelta="0%"
        android:duration="400"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        />
</set>
...