基于Android7.0的Launcher3源码分析(2)——UI显示控件的组成

  开始系列文章前,先把Launcher显示相关的主要控件做个介绍。

界面1


基于Android7.0的Launcher3源码分析(2)——UI显示控件的组成
<

上图就是通常所说的桌面部分,下面会做个简单介绍:

  • SearchDropTagetBar:搜索条和删除条
  • Workspace: 只显示系统默认加载、用户手动拖入和应用自动生成的图标
  • BubbleTextView: 显示应用图标的自定义View,可显示一个图标和底下的文字标题
  • PageIndicator: 页面指示器
  • Hotseat:快捷启动栏

Workspace: 常用工作区

继承关系:
ViewGroup
|__ PagedView
  |__ Workspace

  该区域用于放置一些常用的应用快捷方式,小部件等。该区域在Launcher第一次加载时默认是没有内容的,做客制化时一般会通过配置default_workspace_xxx.xml 文件来预置一些应用快捷方式或小部件进行加载和显示。
  从上图的继承关系可知,Workspace是一个view容器,但是它并不直接用于放置应用图标。因为Workspace是可以分页的,它的每一页又是一个ViewGroup类——com.android.launcher3.CellLayout,应用图标就放置在该容器中。CellLayout通过 addViewToCellLayout 方法将图标view进行添加,然后Workspace再通过 addView 方法将CellLayout添加进来。
  那么页面的滑动是如何实现的呢?这里并没有使用系统用于滑动的API——android.widget.Scroller。而是自定义了一个滑动实现类——com.android.launcher3.LauncherScroller,不过还是参照Scroller来进行实现的。从注释来看,估计是为了后面的开发者更方便的注入插值器,以实现不用的滑动效果。如:淡入淡出,百叶窗等页面切换效果。

Hotseat:快捷启动栏

继承关系:
FrameLayout
|__ Hotseat

  该区域用于放置最常用的应用快捷方式。一共只能放置几个应用的快捷方式(具体几个,根据桌面每行放置图标个数的参数决定)。
  跟Workspace类似,Hotseat的子View也是CellLayout,它也是通过CellLayout的 addViewToCellLayout 方法将应用快捷方式图标加入到CellLayout中进行显示。

BubbleTextView: 显示应用图标的自定义View

继承关系:
TextView
|__ BubbleTextView

  可以看到,应用的快捷方式图标是用的自定义TextView。其通过Tag的形式,把应用信息和对应的View进行绑定。这里的Tag有多种类型,这里简单介绍一下。

  • ItemInfo:所有Tag的基类。以下都继承自该类。
  • ShortcutInfo:应用快捷方式信息。显示在Workspace的应用图标。
  • AppInfo:应用本身信息。显示在AllApps界面的应用图标。
  • FolderInfo:文件夹信息。将好几个应用放到一个文件夹中。

SearchDropTagetBar:搜索条和删除条

继承关系:
FrameLayout
|__ SearchDropTagetBar

  SearchDropTagetBar 是管理 QsbSearchBar 和 DropTargetBar 两者交替显示的。
  一般情况下,显示QsbSearchBar,即上图中的搜索条。
  当长按应用图标时,QsbSearchBar会隐藏,出现DropTargetBar。根据长按图标的类型不同,会出现三种操作条:1、移除;2、卸载;3、应用信息。
基于Android7.0的Launcher3源码分析(2)——UI显示控件的组成

PageIndicator: 页面指示器

继承关系:
LinearLayout
|__ PageIndicator

  该页面指示器的效果是,当前页面对应的圆点较大。实现很简单,只需要一张稍大的圆点图片和一张稍小的圆点图片。然后通过 addView 方法把圆点加进去即可。

界面2


基于Android7.0的Launcher3源码分析(2)——UI显示控件的组成
<

AllAppsContainerView:所有应用界面。

继承关系:
FrameLayout
|__ BaseContainerView
  |__ AllAppsContainerView

  该界面会通过PackageManager,搜索所有category中包含android.intent.category.LAUNCHER的应用。并在该界面显示其入口图标。
  该界面由两部分组成。上部分的搜索框和下部分的应用列表。搜索框的实现类是 ExtendedEditText ,其继承自 EditText 。应用列表的容器类使用的是 AllAppsRecyclerView ,其继承自 RecyclerView。用于实现多行多列排布的可滑动控件。

扩展

  目前市面上常见的Launcher,很多都是把所有应用界面去掉了。而是把所有的应用图标直接显示在Workspace中。其实实现起来也不难。主要就是修改Launcher的加载流程。在加载Workspace的数据时,就通过PackageManager把所有应用的信息加载进来,把所有应用界面去掉就可以了。后面会做详细实现。