android - Android:在内部充气 RecyclerView 时,如何防止 Fragment 事务的延迟或动画跳过?
问题描述
我正在处理一些片段,但是从一个片段切换到另一个片段时的过渡动画非常滞后,有时甚至会跳过整个动画(我读过这有时是片段性能不佳的结果)。
非常有趣的是,我在该片段中的所有数据获取和计算都是使用在计算线程上设置的协程完全异步完成的。并且包含数据的数组列表甚至都不长或有很多参数。我在 UI 上唯一要做的就是在 RecyclerView Adapter 和 notifyDataSetChanged() 上设置最终列表 -> 仅此而已!所以我的结论是 ViewHolder 膨胀本身就是导致滞后的原因。ViewHolders 的布局 XML 也非常精简(一个可绘制的 res 和三个字符串)。
在片段事务方面,我用 FrameLayout 中的新片段替换当前片段,并使用一组自定义 XML 对象动画器提交。
我已经看到一些答案说我应该将适配器上的项目设置延迟大约 2 秒,但是地狱,最终用户在该片段中导航并在白屏上等待 2 秒之前看起来真的很糟糕数据突然出现。我想要一个平滑的 60fps 过渡到新片段,数据已经显示。
这件事在Android上甚至可能吗?我不是苹果的粉丝,但就动画的流畅度和流畅度而言,iOS 设备严重破坏了 Android 在这个主题上的混乱局面。
我需要任何类型的建议甚至示例来告诉我如何解决这个问题。
谢谢!
解决方案
在添加/替换片段时尝试添加一个 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>
推荐阅读
- angular - RXJS 6:使用异步过滤器对数组进行递归过滤
- azure - 尝试将战争部署到 Azure 时出现问题
- jsrender - JsRender - 在助手中调用助手
- ios - 枚举在不应该初始化时被初始化
- c# - 如何将 x => bool 的 Lambda 传递给方法,并使用它是 Linq Where?
- iot - 如何使用 android 应用程序向物联网传感器发送命令
- python - 在 PyQt 应用程序中,当我尝试从长时间运行的 singleShot 任务中显示对话框窗口时,它们不会被渲染
- d3.js - D3Js 以一个 json 作为输入的多棵树
- python - 在 Django 中使用空值创建左连接
- css - CSS 以可打印的方式突出显示文本