如何消除使用DrawerLayout打开Activity时的延迟?

16

我有一个带DrawerLayout的活动,但每次打开它时都会有一点延迟,就像屏幕白了一下然后我的屏幕才被绘制。这发生在转换完成之后。所以看起来就像屏幕动画过渡出现了跳跃。

我尝试在使用ButterKnife绑定视图后的OnCreate中添加代码,但没有任何作用。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        postponeEnterTransition();
        drawerLayout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            public boolean onPreDraw() {
                drawerLayout.getViewTreeObserver().removeOnPreDrawListener(this);
                startPostponedEnterTransition();
                return true;
            }
        });
    }

是的,我正在为Lollipop进行优化,而对于早期的设备,我只是使用overridePendingTransitions,它运行良好。我的问题仅出现在Lollipop设备上。

顺便说一句,我的进入和退出过渡都定义在xml中的fade_in_out,并在styles中指定。

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorAccent">@color/pink</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowActivityTransitions">true</item>
    <item name="android:windowContentTransitions">true</item>
    <!-- specify enter and exit transitions -->
    <!-- options are: explode, slide, fade -->
    <item name="android:windowEnterTransition">@transition/fade_in_out_transition</item>
    <item name="android:windowExitTransition">@transition/fade_in_out_transition</item>

    <!-- specify shared element transitions -->
    <item name="android:windowSharedElementEnterTransition">@transition/change_clip_bounds</item>
    <item name="android:windowSharedElementExitTransition">@transition/change_clip_bounds</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden|adjustResize</item>
</style>

你尝试过用一个示例项目重现这个问题吗?如果是的话,把它上传到GitHub上进行一些测试会很好。 - Francis Toth
你的抽屉里是否有一些大图像之类的大物件需要加载,可能会导致延迟? - Bas van Stein
我的抽屉里没有什么大的东西,只有文本视图和一个小图标。 - John Ernest Guadalupe
一个问题:这种情况是否在每个设备上执行应用程序时都会发生,还是只在模拟器中发生? - Juan C. V.
它发生在每个设备上。 - John Ernest Guadalupe
3个回答

5

我终于找到了一个解决方案。我不知道为什么或者怎么样它会起作用,但我只知道它消除了动画中的延迟。我在活动的 OnCreate 中添加了一个处理程序,它会在 300ms 后运行其他设置语句,例如将初始片段添加到视图中。

Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        switchFragment();
    }
}, 300);

3
也许是因为棒棒糖在UI元素上有默认的layoutTransition,你试过了吗? drawerLayout.setLayoutTransition(null)

2
我会修改您的退出转换效果:
item name="android:windowExitTransition">@transition/fade_in_out_transition</item>
item 

返回窗口:
name="android:windowReturnTransition">@transition/fade_in_out_transition</item>
  1. 当你使用窗口退出时,在下一个转换开始之前,窗口的可见性会短暂地变为不可见。

设置转换,用于在片段被删除、隐藏或未弹出返回堆栈时将视图移出场景。退出视图将是普通视图或ViewGroup,其isTransitionGroup()返回true。典型的转换将扩展Visibility,因为退出受到从VISIBLE到INVISIBLE更改可见性的控制。如果转换为null,则视图不受影响。

setExitTransition

  1. 返回转换处理窗口关闭,而不是退出,并且不影响窗口可见性。

对Transition XML资源的引用,定义了在窗口准备关闭时用于将视图移出场景的所需转换。对应于setReturnTransition(android.transition.Transition)。

android:windowReturnTransition

  1. 我还建议使用reenter来管理后退操作。

对Transition XML资源的引用,定义了在从先前启动的活动返回时将视图移入场景的所需转换。对应于setReenterTransition(android.transition.Transition)。

android:windowReenterTransition

理解退出/重新进入共享元素转换

  1. 您还可以设置一个bool值,允许转换重叠,但是重叠可能太长,不符合您的要求。

setAllowEnterTransitionOverlap(boolean)

  1. 我也会升级Lollipop到5.0.1
    在5.0.0中存在已在5.0.1中修复的错误。

Linton Ye的这篇博客详细介绍了与Lollipop转换和错误相关的问题。

我的Lollipop转换之旅:第1部分


非常感谢这个。 - John Ernest Guadalupe
我尝试将android:windowExitTransition替换为android:windowReturnTransition,但是该活动仍然变得不可见,并且在下一个活动淡入之前,应用程序菜单会在短暂的一秒钟内可见。 - John Ernest Guadalupe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接