天天看點

在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);
            }
        });
           

繼續閱讀