我可以通过animation以编程方式打开抽屉布局吗?

我使用下面的库创build了应​​用程序抽屉: http : //developer.android.com/training/implementing-navigation/nav-drawer.html

我想打开应用程序时显示导航抽屉与animation。 我怎样才能做到这一点?

Solutions Collecting From Web of "我可以通过animation以编程方式打开抽屉布局吗?"

Predraw听众,又名安全通道

这是predraw监听器的例子。 它会从字面上尽快开始animation,可能有点太快。 你可能想把这个与第二个显示的runnable结合起来。 我不会把这两个组合起来,只是分开。

@Override protected void onCreate(Bundle savedInstanceState) { ... // Building NavDrawer logic here. Just a method call would be best. ... ViewTreeObserver vto = drawer.getViewTreeObserver(); if (vto != null) vto.addOnPreDrawListener(new ShouldShowListener(drawer)); } private static class ShouldShowListener implements OnPreDrawListener { private final DrawerLayout drawerLayout; private ShouldShowListener(DrawerLayout drawerLayout) { this.drawerLayout= drawerLayout; } @Override public boolean onPreDraw() { if (view != null) { ViewTreeObserver vto = view.getViewTreeObserver(); if (vto != null) { vto.removeOnPreDrawListener(this); } } drawerLayout.openDrawer(Gravity.LEFT); return true; } } 

PostDelay Runnable,又名生活危险

 // Delay is in milliseconds static final int DRAWER_DELAY = 200; @Override protected void onCreate(Bundle savedInstanceState) { ... // Building NavDrawer logic here. Just a method call would be best. ... new Handler().postDelayed(openDrawerRunnable(), DRAWER_DELAY); } private Runnable openDrawerRunnable() { return new Runnable() { @Override public void run() { drawerLayout.openDrawer(Gravity.LEFT); } } } 

警告

如果他们在应用程序的第一次启动旋转BOOM! 阅读这篇博文,了解更多信息http://corner.squareup.com/2013/12/android-main-thread-2.html 。 最好的办法是使用预渲染监听器或删除onPause中的可运行。

您可以调用openDrawer(int gravity) ,使其通过animation打开抽屉。

您需要调用drawerLayout.openDrawer(Gravity.LEFT)来为抽屉开口设置animation。 如果您在活动生命周期中过早拨打电话,抽屉将不会animation。

最简单的解决scheme是在onCreate()中设置一个标志,并在onResume()中对其执行操作。

您要确保只在savedInstanceState为空时设置标志,指​​示活动未从后台恢复。 每次更改方向或切换应用程序时,都不希望抽屉滑出。

 public class MainActivity extends ActionBarActivity { private DrawerLayout drawerLayout; private boolean firstResume = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = (DrawerLayout)findViewById(R.id.drawer); if(savedInstanceState == null){ firstResume = true; } } @Override protected void onResume() { super.onResume(); if(firstResume) { drawerLayout.openDrawer(Gravity.LEFT); } firstResume = false; } } 

你也可以使用OnPreDrawListener,但是我觉得这样做有点不必要的复杂,因为onPreDraw被多次调用,所以你需要在打开抽屉后删除监听器。 您还假设preDraw是一个合适的时间来激活抽屉,这是抽屉布局的内部实现。 未来的实现可能无法正确地animation,直到onDraw之后。

延迟抽屉开启任意数毫秒是解决此问题的危险方法。 在最坏的情况下,如果用户很快离开,打开抽屉的呼叫可能会在onDestroy之后发生。