首页 > 解决方案 > Android:在内部充气 RecyclerView 时,如何防止 Fragment 事务的延迟或动画跳过?

问题描述

我正在处理一些片段,但是从一个片段切换到另一个片段时的过渡动画非常滞后,有时甚至会跳过整个动画(我读过这有时是片段性能不佳的结果)。

非常有趣的是,我在该片段中的所有数据获取和计算都是使用在计算线程上设置的协程完全异步完成的。并且包含数据的数组列表甚至都不长或有很多参数。我在 UI 上唯一要做的就是在 RecyclerView Adapter 和 notifyDataSetChanged() 上设置最终列表 -> 仅此而已!所以我的结论是 ViewHolder 膨胀本身就是导致滞后的原因。ViewHolders 的布局 XML 也非常精简(一个可绘制的 res 和三个字符串)。

在片段事务方面,我用 FrameLayout 中的新片段替换当前片段,并使用一组自定义 XML 对象动画器提交。

我已经看到一些答案说我应该将适配器上的项目设置延迟大约 2 秒,但是地狱,最终用户在该片段中导航并在白屏上等待 2 秒之前看起来真的很糟糕数据突然出现。我想要一个平滑的 60fps 过渡到新片段,数据已经显示。

这件事在Android上甚至可能吗?我不是苹果的粉丝,但就动画的流畅度和流畅度而言,iOS 设备严重破坏了 Android 在这个主题上的混乱局面。

我需要任何类型的建议甚至示例来告诉我如何解决这个问题。

谢谢!

标签: androidanimationfragmentfragmentmanagerfragmenttransaction

解决方案


在添加/替换片段时尝试添加一个 startOffset(如 300 毫秒),片段将从后台预加载,300 毫秒后,应用程序将运行动画流畅地显示您的片段。

300ms 只是一个随机数,它实际上取决于您需要初始化的 UI 的重量。

希望这有帮助。

<?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>

推荐阅读