我使用以下库创建了应用程序抽屉: http://developer.android.com/training/implementing-navigation/nav-drawer.html
我想在打开应用程序时使用动画显示导航抽屉。 我该如何做到这一点?
我使用以下库创建了应用程序抽屉: http://developer.android.com/training/implementing-navigation/nav-drawer.html
我想在打开应用程序时使用动画显示导航抽屉。 我该如何做到这一点?
预绘制监听器,也称为安全方式
这是一个预绘制监听器的示例。它会尽可能快地启动动画,可能会有点太快。您可能需要将其与第二个可运行对象组合使用。我不会展示两者的组合,仅单独展示。
@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);
}
}
}
警告
如果在应用程序首次启动时它们开始旋转,糟糕了! 阅读此博客文章以获取更多信息:http://corner.squareup.com/2013/12/android-main-thread-2.html。最好的做法是使用predraw监听器或在onPause中删除您的可运行项。
DrawerLayout
上调用openDrawer(int gravity)
以使其动画打开抽屉。您需要调用 drawerLayout.openDrawer(Gravity.LEFT)
来启动抽屉的动画效果。如果您在 Activity 生命周期过早地进行此调用,抽屉将无法进行动画。
最简单的解决方案是在 onCreate() 中设置一个标志,并在 onResume() 中执行操作。
确保仅在 savedInstanceState 为 null 时设置标志,说明 Activity 不是从后台恢复的。您不希望每次更改方向或切换应用程序时都会滑出抽屉。
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;
}
}