博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在navigationView中切换/创建fragment时的卡顿优化
阅读量:3778 次
发布时间:2019-05-22

本文共 1561 字,大约阅读时间需要 5 分钟。

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

这里写图片描述

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

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

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

这里写图片描述

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

drawer在半关闭状态时开始掉帧,然后到下一帧时已经是完全关闭状态,这中间漏掉的好几帧直接让我们感觉到卡顿。
所以我试着将这个创建过程延时到drawer关闭之后,这样的话,因为当前没有动画,是一个近乎静态的界面,掉帧也不会太明显,大概是这样的效果:

这里写图片描述

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

在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);            }        });
你可能感兴趣的文章
策略模式
查看>>
Spring Boot 实战 入门
查看>>
关于web系统整体优化提速总结
查看>>
分布式文件系统 - fastDFS
查看>>
BUAA OO 2019 第一单元作业总结
查看>>
格网编码查询方案在项目运用上的进一步探索
查看>>
BUAA-OO-2019 第三单元总结
查看>>
Matlab策略模式
查看>>
架构整洁之道
查看>>
支付渠道路由系统进化史
查看>>
行为型模式:解释器模式
查看>>
深入理解设计模式(22):享元模式
查看>>
spring boot
查看>>
Angular框架
查看>>
行为型模式:模板方法
查看>>
spring cloud之Feign的使用
查看>>
Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
查看>>
LeetCode刷题 --杂篇 --数组,链表,栈,队列
查看>>
840. 模拟哈希表(模板)
查看>>
《算法》笔记 17 - 数据压缩
查看>>