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

Posted

技术标签:

【中文标题】使用 DrawerLayout 打开 Activity 时如何消除延迟?【英文标题】:How to remove the delay when opening an Activity with a DrawerLayout? 【发布时间】:2015-12-05 00:26:03 【问题描述】:

我有一个带有 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;
            
        );
    

是的,我正在为棒棒糖优化它,对于棒棒糖之前的设备,我只是使用overridePendingTransitions,它工作正常。我的问题只在 Lollipop 设备上。

顺便说一句,我的 Enter 和 Exit 转换都是 fade_in_out在 xml 中定义并在 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 上并进行一些测试。 您的抽屉里是否有一些像大图片这样的大东西需要加载并可能导致延迟? 我的抽屉里没有大东西,只有文本视图和一个小图标。 一个问题:这总是发生在您执行应用程序的每台设备上,还是仅在模拟器中? 它发生在每个设备中 【参考方案1】:

我终于找到了解决办法。我不知道为什么或如何解决,但我只知道它消除了动画的延迟。我在活动的OnCreate 中添加了一个处理程序,它将运行其他语句进行设置,即将初始片段添加到视图中,300 毫秒后

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

【讨论】:

【参考方案2】:

可能是因为 lollipop 在 UI 元素上有默认的 layoutTransition,你试过了吗?

drawerLayout.setLayoutTransition(null)

【讨论】:

【参考方案3】:

我会改变你的退出过渡:

item name="android:windowExitTransition">@transition/fade_in_out_transition</item>
item 

到窗口返回:

name="android:windowReturnTransition">@transition/fade_in_out_transition</item>
    当您使用窗口退出时,窗口的可见性会在您的下一个过渡开始之前短暂更改为不可见。

设置将用于将视图移出场景的转换 当片段被移除、隐藏或分离时,不弹出时 后栈。现有视图将是常规视图 具有 isTransitionGroup() 的视图或视图组返回 true。 典型的转换将扩展可见性,因为退出由 将可见性从可见更改为不可见。如果转换为空, 视图将不受影响。

setExitTransition

    返回过渡处理窗口关闭,而不是退出,并且不影响窗口可见性。

对定义所需的转换 XML 资源的引用 当 Window 为 准备关闭。对应于 setReturnTransition(android.transition.Transition).

android:windowReturnTransition

    我还建议使用 reenter 来管理后按。

对定义所需转换的转换 XML 资源的引用 用于从一个返回时将视图移动到场景中 之前启动的活动。对应于 setReenterTransition(android.transition.Transition).

android:windowReenterTransition

Understanding exit/reenter shared element transitions

    您也可以设置一个布尔值来允许过渡重叠,但是重叠可能太长 满足您的需求。

setAllowEnterTransitionOverlap(boolean)

    我还将棒棒糖升级到 5.0.1 5.0.0 中的一些错误已在 5.0.1 中修复

Linton Ye 的这篇博客详细介绍了有关 Lollipop 过渡和错误的问题。

My Journey to Lollipop Transitions: part 1

【讨论】:

非常感谢 我尝试用android:windowReturnTransition 替换这个android:windowExitTransition,但是活动仍然不可见,并且在下一个活动淡入之前,应用程序菜单在一瞬间可见。

以上是关于使用 DrawerLayout 打开 Activity 时如何消除延迟?的主要内容,如果未能解决你的问题,请参考以下文章

菜单抽屉仅用两根手指滑动即可打开 DrawerLayout

如何检测 DrawerLayout 开始打开?

关闭左侧时,防止DrawerLayout打开右侧?

DrawerLayout使用详解

带有 DrawerLayout 的 ScrollView 内的 ListView

在 DrawerLayout 上禁用手势监听器