我使用以下库创建了app抽屉: http://developer.android.com/training/implementing-navigation/nav-drawer.html
我想在打开应用时向导航抽屉显示动画。 我怎么能这样做?
答案 0 :(得分:53)
Predraw听众,又名安全之路
这是predraw监听器示例。它会尽可能快地启动动画,这可能有点太快了。您可能希望将其与可运行的第二个相结合。我不会显示两者的结合,只是单独的。
@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。最好的办法是使用predraw监听器或删除onPause中的runnable。
答案 1 :(得分:7)
您可以在openDrawer(int gravity)
上致电DrawerLayout
,让它通过动画打开抽屉。
答案 2 :(得分:1)
您需要致电drawerLayout.openDrawer(Gravity.LEFT)
为抽屉开口设置动画。如果您在“活动”生命周期中过早拨打电话,抽屉将不会生成动画。
最简单的解决方案是在onCreate()中设置一个标志,并在onResume()中对其进行操作。
您希望确保仅在savedInstanceState为null时设置标志,表示未从后台恢复活动。每次更改方向或切换应用程序时,您都不希望抽屉滑出。
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是激活抽屉的合适时间,抽屉是抽屉布局的内部实现。例如,在onDraw之后,未来的实现可能无法正常设置动画。
将抽屉开口延迟任意数毫秒是解决此问题的危险方法。在最糟糕的情况下,打开抽屉的调用可能在onDestroy之后发生,如果用户快速导航的话。