天天看点

在navigationView中切换/创建fragment时的卡顿优化

在我们的app界面中,经常会有这样的布局:

在navigationView中切换/创建fragment时的卡顿优化

mainActivity托管多个fragment,在navigationView的点击事件中处理fragment的切换逻辑,很简单也很实用。

一看到这样的逻辑,我们首先就会想到,fragment之间的关系不能是replace,这样的话每次切换都会销毁并创建新的实例,影响切换时的体验,所以我们用hide和show来隐藏/显示他们。

但不可避免的是,即便我们使用hide与show,fragment必然需要一个创建与初始化的过程,这个过程将发生在首次切换到某个fragment时,这样的话,会有明显的掉帧,如图:

在navigationView中切换/创建fragment时的卡顿优化

在仔细观察掉帧动画后发现,之所以我们可以发现掉帧,是因为它发生在drawer关闭的过程中。

drawer在半关闭状态时开始掉帧,然后到下一帧时已经是完全关闭状态,这中间漏掉的好几帧直接让我们感觉到卡顿。

所以我试着将这个创建过程延时到drawer关闭之后,这样的话,因为当前没有动画,是一个近乎静态的界面,掉帧也不会太明显,大概是这样的效果:

在navigationView中切换/创建fragment时的卡顿优化

说完了思路,具体实现就很简单了。

在NavigationView的点击事件中做一个标记,记录被点击的item;

为DrawerLayout添加监听,在onDrawerClosed中处理被点击item的相关事件;

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
            //关闭drawer
                if(drawerLayout.isDrawerOpen(Gravity.LEFT)){
                    drawerLayout.closeDrawers();
                }

                switch (item.getItemId()){
                    case R.id.navigation_csdn:
                        selectedItem = Const.FRAGMENT_CSDN;
                        break;
                    case R.id.navigation_hukai:
                        selectedItem = Const.FRAGMENT_HUKAI;
                        break;
                    //......
                }
                return true;
            }
        });

drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerClosed(View drawerView) {
            //在这里处理切换fragment的逻辑
                switcher.switchFragment(selectedItem);
            }
        });
           

继续阅读