当前位置: 首页 > 知识库问答 >
问题:

我可以以编程方式打开带有动画的抽屉布局吗?

郎增
2023-03-14

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

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

共有3个答案

杜起运
2023-03-14

您需要调用抽屉布局。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被多次调用,所以你需要在打开抽屉后删除侦听器。您还假设预绘制是激活抽屉的合适时间,抽屉是抽屉布局的内部实现。例如,在onDraw之后,未来的实现可能无法正确设置动画。

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

乌灿
2023-03-14

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

王子明
2023-03-14

预绘制监听器,也就是安全通道

下面是预绘制侦听器示例。它会尽快启动动画,这可能有点太快了。您可能希望结合使用可运行的显示秒。我不会把两者结合起来,只会分开。

@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.最好的做法是使用预绘制侦听器或在onPause中删除runnable。

 类似资料:
  • 问题内容: 我正在开发一个Twitter应用程序,该应用程序直接从Twitter引用图像。如何防止动画gif播放? 在页面末尾使用不适用于Firefox。 是否有更好的JavaScript技巧?最好对所有浏览器都适用 问题答案: 这不是跨浏览器的解决方案,但是可以在Firefox和Opera中使用(不适用于ie8:-/)。采取从这里

  • 我正在尝试为具有特定扩展名的文件在“打开”菜单中添加eclipse编辑器。我在org.eclipse.ui.editors扩展点中使用launcher实现了这一点,在launcher中我使用了“open editor”方法,它需要传递编辑器ID。有没有什么方法可以让我们以编程方式打开一个编辑器,而不需要传递编辑器ID呢?我们可以通过传递实现编辑器的类的实例以编程方式打开编辑器吗?..

  • 我想通过编程(从关联菜单)打开某个视图,我该怎么做? 我可以使用e3兼容层显示如下视图: e4的方法是什么?

  • 问题内容: 我使用了Android Studio中提供的Navigation Drawer模板。在我的活动布局中,我有以下代码: 我需要以编程方式更改面板的宽度。我认为更改它的正确区域是: 但是我不明白如何实现我的目标。 / 更新 / 抽屉面板的图标未显示在操作栏中 那就是selectItem方法 问题答案: 基于从Navigation Drawer模板生成的代码,可以通过将代码添加到Naviga

  • 问题内容: 对此进行一些研究,似乎您无法在iOS 6或7中切换“请勿打扰”模式。想知道您是否可以在iOS 8中进行操作。我在Apple的文档中找不到任何内容 任何帮助都会很棒。谢谢! 问题答案: 此功能将在Apple放置每个应用程序的沙箱外部。应用程序之间的联系和沙箱外部的联系非常受限制。Apple可以让您摆脱的一个示例是打开手电筒,但是像AirPlane模式一样,“请勿打扰”(应该是)受到限制。

  • 问题内容: 我们可以通过编程方式在自己的Java代码中使用javap吗? 例如,以下代码: 在命令行中使用javap,我们得到了: 我可以使用javap的API仅打印常量池吗? 问题答案: Apache BCEL 提供.class文件解析的封装,该封装提供了一组API。几乎对于.class文件中的每个元素,BECL API中都有一个对应的Class来表示它。因此,从某种角度来说,如果您只想打印出类