我有一个ViewPager
控制五个Fragments
。当我从索引1处的Fragment
到索引0处的Fragment
,时,我想消除动画中的短暂停顿。
目前,我没有打电话给setOffscreenPageLimit()
,所以我知道Fragment
0在我ViewPager
1 Fragment
时被Fragment
保留在内存中其空闲状态,因为屏幕外页面限制默认为1(当前setOffscreenPageLimit(4)
两侧各一个)。
这里让人感到困惑。如果我在ViewPager
,上调用Fragments
,则从1到0的动画中的暂停消失了 - 动画很流畅。
因此,我得出结论,不知何故,将Fragment
2-4保留在内存中可以将动画从Fragment
1改为Fragments
0。
保留Fragment
2-4如何改进从Fragment
1到onPageScrollStateChanged(int state)
0的滑动动画?
修改
我使用@Override
public void onPageScrollStateChanged(int state) {
if (state == 1 && mViewPager.getCurrentItem() == 1) {
Debug.startMethodTracing("ViewPagerTesting", 100000000);
}
if (state == 0 && mViewPager.getCurrentItem() == 0) {
Debug.stopMethodTracing();
}
}
运行TraceView,以确定何时开始和停止跟踪,如下所示:
ViewPager
setOffscreenPageLimit(4)
的辅助功能方法似乎导致UI线程冻结。当我在ViewPager上调用{{1}}时,这些可访问性方法在跟踪中会缩短 - 花费的时间可以忽略不计。
造成延误的原因是什么?
答案 0 :(得分:9)
当您使用setOffscreenPageLimit()
的默认实现时,它只加载一个位于其右侧的片段。例如。当你在索引1上时,它在内存中加载索引2但不在索引0中加载,因此向左滑动必须从头开始生成一个新片段。要测试此理论,您可能需要使用setOffscreenPageLimit(2)
,然后尝试滑动索引1-> 0。这绝不是最佳解决方案,但有助于消除您对该概念的疑虑。