Optimizing drawer and activity launching speed

前端 未结 7 2017
傲寒
傲寒 2020-12-04 07:44

I\'m using the Google DrawerLayout.

When an item gets clicked, the drawer is smoothly closed and an Activity will be launched. Turning thes

7条回答
  •  感情败类
    2020-12-04 08:32

    According the docs,

    Avoid performing expensive operations such as layout during animation as it can cause stuttering; try to perform expensive operations during the STATE_IDLE state.

    Instead of using a Handler and hard-coding the time delay, you can override the onDrawerStateChanged method of ActionBarDrawerToggle (which implements DrawerLayout.DrawerListener), so that you can perform the expensive operations when the drawer is fully closed.

    Inside MainActivity,

    private class SmoothActionBarDrawerToggle extends ActionBarDrawerToggle {
    
        private Runnable runnable;
    
        public SmoothActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) {
            super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);
        }
    
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }
        @Override
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }
        @Override
        public void onDrawerStateChanged(int newState) {
            super.onDrawerStateChanged(newState);
            if (runnable != null && newState == DrawerLayout.STATE_IDLE) {
                runnable.run();
                runnable = null;
            }
        }
    
        public void runWhenIdle(Runnable runnable) {
            this.runnable = runnable;
        }
    }
    

    Set the DrawerListener in onCreate:

    mDrawerToggle = new SmoothActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    

    Finally,

    private void selectItem(int position) {
        switch (position) {
            case DRAWER_ITEM_SETTINGS: {
                mDrawerToggle.runWhenIdle(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
                        startActivity(intent);
                    }
                });
                mDrawerLayout.closeDrawers();
                break;
            }
            case DRAWER_ITEM_HELP: {
                mDrawerToggle.runWhenIdle(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(MainActivity.this, HelpActivity.class);
                        startActivity(intent);
                    }
                });
                mDrawerLayout.closeDrawers();
                break;
            }
        }
    }
    

提交回复
热议问题