21

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

我想在打开应用程序时显示带有动画的导航抽屉。我怎样才能做到这一点?

4

3 回答 3

53

预画监听器,又名安全通道

这是预绘制侦听器示例。它会尽快开始动画,这可能有点太快了。您可能希望将此与第二个显示的可运行文件结合起来。我不会将两者结合起来,仅将其分开。

@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 中删除您的可运行文件。

于 2013-11-09T22:02:13.807 回答
7

您可以调用openDrawer(int gravity)DrawerLayout使其打开带有动画的抽屉。

于 2013-08-06T02:42:03.357 回答
2

您需要调用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;
    }
}

您也可以使用OnPreDrawListener,但我觉得它有点不必要地复杂,因为 onPreDraw 被多次调用,因此您需要在打开抽屉后删除侦听器。您还假设 preDraw 是激活抽屉的合适时间,抽屉是抽屉布局的内部实现。例如,在 onDraw 之后,未来的实现可能无法正确设置动画。

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

于 2015-01-14T01:26:57.040 回答