我正在开发一个使用导航抽屉图案的应用程序(使用DrawerLayout) .
每次单击抽屉的项目,都会替换主容器中的片段 .
但是,我不确定何时是进行片段交易的合适时机?抽屉开始关闭时?或者关闭后?
在谷歌的documentaion example中,您可以看到他们在项目点击后立即进行交易,然后关闭抽屉 .
结果,抽屉看起来很迟钝而且不平滑,看起来非常糟糕(它也发生在我的应用中) .
在Gmail和Google Drive应用程序中,另一方面,看起来他们在抽屉关闭后正在进行交易(我是对吗?) .
结果,抽屉没有延迟且非常平滑,但至少需要大约1秒钟(抽屉关闭所需的时间)才能看到下一个片段 .
在立即进行片段交易时,似乎抽屉没有办法顺畅 .
你觉得怎么样?
提前致谢!
7 回答
是的,不能同意,执行一个片段(带有视图)事务导致布局传递,导致动画视图上的janky动画,引用
DrawerLayout
docs:因此,请在抽屉关闭或有人修补支持库以某种方式修复:)之后执行您的片段事务
另一种解决方案是在关闭抽屉后创建
Handler
并发布延迟Runnable
,如下所示:https://stackoverflow.com/a/18483633/769501 . 这种方法的好处是,如果您等待DrawerListener#onDrawerClosed()
,您的碎片将比它们更快地被替换,但当然任意延迟并不能100%保证抽屉动画将及时完成 .也就是说,我使用了200ms的延迟,它运行得非常好 .
这就是我为实现类似于Gmail应用程序的流畅交易动画所做的工作:
activity_drawer.xml
DrawerActivity.java
希望对你有所帮助! :-)
我知道这个问题已经过时了,但我遇到了同样的问题并且认为我会发布我的解决方案,因为我认为这是一个比添加硬编码延迟时间更好的实现 . 我所做的是在执行任务之前使用
onDrawerClosed
函数来验证抽屉是否已关闭 .然后在
onDrawerClosed
中,打开相应的活动 .只需在处理程序中编写代码并将200 ms延迟 .
而不是延迟您的商品点击,这可能会让您的应用感到缓慢 . 我只是推迟关闭mDrawerLayout . 我也不会使用
DrawerLayout.OnDrawerListener onClose(...)
因为那些回调调用太慢了 .如果您希望它平滑且没有任何延迟,请将抽屉保持打开状态,然后在返回时将其关闭(在onRestart()方法中) .
副作用是返回时的(快速)动画,但这可能是可以接受的 .