打开DrawerLayout,执行操作,然后关闭它

Ela*_*ron 0 animation android drawerlayout

因此,我希望以这样的方式为DrawerLayout设置动画,使其打开,将一个项目添加到其中的菜单中,然后将其关闭.

我尝试了很多东西,但问题是"打开"和"关闭"命令之间没有延迟(或者至少没有明显的延迟),因此动画永远不会触发.

我真的不想使用任意长度的'post delayed',因为这看起来很脏.我已经尝试在监听器中手动覆盖"onDrawerOpened()" - 这已经工作了,但是在执行操作后我无法关闭它,因为你无法从内部关闭它(意思是,如果'closeDrawer(布局) )'方法是从侦听器本身的任何子线程调用的,它将得到运行时错误).

所以我拥有的是:

 _drawerToggle = new ActionBarDrawerToggle(MainActivity.this, _drawerLayout, R.drawable.ic_drawer, R.string.drawerOpen, R.string.drawerClose)
 {
      /** Called when a drawer has settled in a completely closed state. */
      public void onDrawerClosed(View view) {
           getActionBar().setTitle(_title);
      }

       /** Called when a drawer has settled in a completely open state. */
      public void onDrawerOpened(View drawerView) {
           myAction(); //My action                            
           //If I try to invoke 'drawerClose()' here or in my action, a runtime error occurs
      }
 };
 _drawerLayout.setDrawerListener(_drawerToggle);
 _drawerLayout.openDrawer(_mainFrame);
 //If I invoke 'drawerClose()' the entire thing is just too fast and the animations don't trigger
Run Code Online (Sandbox Code Playgroud)

我甚至在DrawerLayout上尝试'getAnimation()',但它返回null,所以我不能用它来发布延迟动作.

任何人都知道如何处理这个问题?我应该使用任意延迟并希望它在所有设备上看起来都一样吗?有没有办法从听众中关闭抽屉?提前致谢!

bcl*_*mer 5

呼叫closeDrawer()不起作用,onDrawerOpened()因为抽屉没有完成打开.如果你看到onDrawerStateChanged()你会注意到状态在onDrawerOpened()被叫之后仍然会发生变化.

onDrawerStateChanged()抽屉闲置时,我试着关上抽屉,但它仍然坠毁.正如你所说,我的最终解决方案看起来很糟糕.但它有效,看起来很流畅.这应放在onDrawerOpened()

new Thread() {
    @Override
    public void run() {
        SystemClock.sleep(500);
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mDrawerLayout.closeDrawers();
            }
        });
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

如果您使用某种排序或线程管理器(如此处发布的那样),这可能看起来会好一些

https://gist.github.com/bclymer/6708605

免责声明,这是我的实用工具类.我在大多数应用程序中都使用它,但它非常方便.使用该实用程序代码看起来像

ThreadManager.delayOnMainThread(new Runnable() {
    @Override
    public void run() {
        mDrawerLayout.closeDrawers();           
    }
}, 500);
Run Code Online (Sandbox Code Playgroud)