我可以用动画程序打开抽屉布局吗



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

我想在打开应用程序时显示带有动画的导航抽屉。我该怎么做?

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可运行,又称生活危险

// 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中删除可运行程序。

您可以在DrawerLayout上调用openDrawer(int gravity),使其用动画打开抽屉。

您需要调用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之后可能会调用打开抽屉。

最新更新