由于最近解决Launcher3所有应用界面,一个区域图标闪烁的问题,故将Launcher3这部分代码梳理了一编,做个总结归纳一下。
Launcher3的主入口是Launcher.java这个Activity文件,并且他的布局文件的入口在luancher.xml,从这个入口开始延申很多东西出来,如果深入研究,你会发现这套代码非常庞大,
并且运用了很多设计模式在里面,并且后续为了完善又出了quickstep这种版本。
本次需要研究的范围主要为AllApps这个模块,这也是我们上拉之后会出现的所有应用界面。并且我们把范围继续缩小到每个图标。
在分析之前我们需要搞清楚几个概念,就是workspace,allapps,draglayer,hotset,apps_view,overview这几个部分。当我们打开launcher.xml后会发现这些相关的部分,如果不搞清每个部分负责哪些功能,分析代码
时会难度很大,不能缩小到我们想要的部分。首先我们可以看到launcher.xml是由一个自定义控件LauncherRootView来实现的,并且他的控件(不包括孙子空间)只有一个,那就是DragLayer,从字面我们可以
猜测到这是一个拖拽的视图。这也就是我们的laucher可以上下左右拖拽的功能实现。
下面我们看看DragLayer的子控件。
workspace,这个就是我们开机启动和点击home键所回到的主界面。
hotset,这个就是我们workspace下的底座显示的图标,用于一些常用应用的放置,windows同样有这个功能,位于导航栏之上。
overview_panel,这个是我们长按桌面空白区域会进入到的界面。
apps_view,这个就是我们所有应用的界面allapps。
那么接下来我们就主要寻找这个apps_view,它的定义位于all_apps.xml。这里面又包含了一个all_apps_rv_layout,这就是我们所有应用被列表起来的界面,它在我们的all_apps_rv_layout.xml。这个布局文件里面没有子控件。
这是一个自定义控件AllAppsRecyclerView,它继承于BaseRecylerView,并且BaseRecylerView又继承于RecylerView,
RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。
关于这个视图的使用方法参考链接https://www.jianshu.com/p/b4bb52cdbeb7。通过对RecyclerView的学习可以发现需要对这个视图进行一些配置。
那么就需要看一下调用AllAppsRecyclerView的视图all_app.xml。这个视图也是一个自定义视图AllAppsContainerView,我们去看到在内部类AdapterHolder里的setup函数中调用了AllAppsRecyclerView,并对其进行设置。