Android 4.0 Launcher源码分析系列(一)

原创 2012年03月31日 14:30:36

先从整体上对Launcher布局作一个分析,让我们通过查看Launcher.xml 和使用hierarchyviewer布局查看工具两者结合的方法来对Launcher的整体结构有个了解。通过hierarchyviewer来对整个桌面做个截图,如下:

通过hierarchyviewer来对整个桌面做个截图

放大后如下所示: 可以看到整个桌面包含的元素,最上面是Google的搜索框,下面是一个始终插件,然后是图标,再有就是一个分隔线,最后是dock。请注意,桌面程序其实并不包含桌面壁纸,桌面壁纸其实是由 WallpaperManagerService来提供,整个桌面其实是叠加在整个桌面壁纸上的另外一个层。

放大后所示

整个Launcher.xml布局文件如下:

    <com.android.launcher2.DragLayer 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher" 
     
        android:id="@+id/drag_layer" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
     
        <!-- Keep these behind the workspace so that they are not visible when 
             we go into AllApps --> 
        <include 
            android:id="@+id/dock_divider" 
            layout="@layout/workspace_divider" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:layout_marginBottom="@dimen/button_bar_height" 
            android:layout_gravity="bottom"  /> 
        <include 
            android:id="@+id/paged_view_indicator" 
            layout="@layout/scroll_indicator" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_gravity="bottom" 
            android:layout_marginBottom="@dimen/button_bar_height"  /> 
     
        <!-- The workspace contains 5 screens of cells --> 
        <com.android.launcher2.Workspace 
            android:id="@+id/workspace" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            android:paddingTop="@dimen/qsb_bar_height_inset" 
            android:paddingBottom="@dimen/button_bar_height" 
            launcher:defaultScreen="2" 
            launcher:cellCountX="4" 
            launcher:cellCountY="4" 
            launcher:pageSpacing="@dimen/workspace_page_spacing" 
            launcher:scrollIndicatorPaddingLeft="@dimen/workspace_divider_padding_left" 
            launcher:scrollIndicatorPaddingRight="@dimen/workspace_divider_padding_right"> 
     
            <include android:id="@+id/cell1" layout="@layout/workspace_screen"  /> 
            <include android:id="@+id/cell2" layout="@layout/workspace_screen"  /> 
            <include android:id="@+id/cell3" layout="@layout/workspace_screen"  /> 
            <include android:id="@+id/cell4" layout="@layout/workspace_screen"  /> 
            <include android:id="@+id/cell5" layout="@layout/workspace_screen"  /> 
        </com.android.launcher2.Workspace> 
     
        <include layout="@layout/hotseat" 
            android:id="@+id/hotseat" 
            android:layout_width="match_parent" 
            android:layout_height="@dimen/button_bar_height_plus_padding" 
            android:layout_gravity="bottom"  /> 
     
        <include 
            android:id="@+id/qsb_bar" 
            layout="@layout/qsb_bar"  /> 
     
        <include layout="@layout/apps_customize_pane" 
            android:id="@+id/apps_customize_pane" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            android:visibility="invisible"  /> 
     
        <include layout="@layout/workspace_cling" 
            android:id="@+id/workspace_cling" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            android:visibility="gone"  /> 
     
        <include layout="@layout/folder_cling" 
            android:id="@+id/folder_cling" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            android:visibility="gone"  /> 
    </com.android.launcher2.DragLayer> 

Launcher整个布局的根是DragLayer,DragLayer继承了FrameLayout,所以DragLayer本身可以看作是一个FrameLayout。下面是 dock_divider,它通过include关键字包含了另外一个布局文件workspace_divider.xml ,而这个workspace_divider.xml包含了一ImageView,其实dock_divider就是dock区域上面的那条直线。

再下面是paged_view_indicator,同样它包含了scroll_indicator.xml,其中包含了一个ImageView,显示的是一个.9的png文件。实际上就是当Launcher滚动翻页的时候,那个淡蓝色的页面指示条。

然后桌面的核心容器WorkSpace,如下图所示,当然你看到的只是Workspace的一部分,其实是一个workspace_screen,通过 Launcher.xml可以看到,整个workspace由5个workspace_screen组成,每个workspace_screen其实就是对应桌面一页。而每个workspace_screen包含了一个CellLayout,这是一个自定义控件,继承自ViewGroup,所以它算是一个用来布局的控件,在这里主要用来承载我们每页的桌面图标、widget和文件夹。

桌面的核心容器WorkSpace

通过查看如下的布局结构(由于图太大只截取了一部分)可以看到,Workspace包含了序号从0到4的5个CellLayout。

查看布局结构

接下来是一个Hotseat,其实就是这块dock区域了。如图所示:

从如下的布局图我们可以看到,这个Hotseat其实还是包含了一个CellLayout,用来承载4个图标和中间启动所有程序的按钮。

用来承载4个图标和中间启动所有程序的按钮

再下来就是那个qsb_bar,就是屏幕最顶端的Google搜索框。这个搜索框是独立于图标界面的,所以当我们对桌面进行翻页的时候,这个搜索框会巍然不动滴固定在最顶端,如下所示:

最顶端的Google搜索框

紧接着是3个初始化时被隐藏的界面。

apps_customize_pane,点击dock中显示所有应用程序的按钮后才会从隐藏状态转换为显示状态,如下图所示,显示了所有应用程序和所有插件的界面。

所有应用程序和所有插件的界面


通过查看apps_customize_pane.xml ,我们可以看到apps_customize_pane主要由两部分组成:tabs_container 和tabcontent。tabs部分,用来让我们选择是添加应用程序还是widget,如下图所示:

用来让我们选择是添加应用程序还是widget

tabcontent,选择了相应的tab之后,下面的部分就会相应的显示应用程序或是widget了,如下图所示:

面的部分就会相应的显示应用程序或是widget

workspace_cling  和 folder_cling 是刚刷完机后,进入桌面时,显示的使用向导界面,介绍怎么使用workspace和folder,跳过以后就再也不会出现了,这里就不截图了。

Launcher2修改--快捷界面和All Apps Icon大小和背景(二)

这里的修改均以横屏,分辨率为800*480为例,因为屏不同方向和分辨率使用的资源是不一样的,下面先来看下修改前后的对比图 修改前是4x4: 修改后是3x5: 修改的文件有layout-land...
  • deng0zhaotai
  • deng0zhaotai
  • 2015年11月04日 10:04
  • 2415

android7.x Launcher3源码解析(1)---启动流程

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launche...
  • Picasso_L
  • Picasso_L
  • 2017年04月07日 16:10
  • 2965

Android4.4-Launcher源码分析系列之Launcher介绍

一.Launcher是什么 Launcher是启动器的意思,最直观的就是手机上的桌面.其实它是个Activity. public class Launcher extends Activity...
  • qq_31530015
  • qq_31530015
  • 2016年05月19日 16:08
  • 3939

Android M Launcher3主流程源码浅析

关于Launcher是啥的问题我想这里就没必要再强调了。由于一些原因迫使最近开始需要研究一下Launcher3源码,为了不再像以前那么傻逼(研究Settings等代码没作笔记),故这里赶紧将阶段性的感...
  • yanbober
  • yanbober
  • 2016年01月20日 11:35
  • 18130

Android Launcher源码分析(一)

最近开始看Android Launcher源码,对一些关键类进行整理,想和大家分享一下。 关于Launcher布局、自定义布局属性等,以下博文已经进行详细的介绍,我就不再展开了,在此分享链接,感...
  • jhg19900321
  • jhg19900321
  • 2014年06月05日 00:11
  • 823

Android Launcher加载流程源码分析

最近开始接手Launcher模块,为了更好的技术积累,也看到很多大神在CSDN上发的博文,就有了在CSDN写博客的想法,这篇博文是我在研究了一段时间Launcher3后写的,可能有不对的,望大家拍砖...
  • heraldyqf
  • heraldyqf
  • 2017年03月13日 15:55
  • 478

Android源码解析之(十)-->Launcher启动流程

Launcher程序就是我们平时看到的桌面程序,它其实也是一个android应用程序,只不过这个应用程序是系统默认第一个启动的应用程序,这里我们就简单的分析一下Launcher应用的启动流程。 不同...
  • qq_23547831
  • qq_23547831
  • 2016年04月10日 20:16
  • 9649

Launcher2修改--快捷界面和All Apps Icon大小和背景(二)

这里的修改均以横屏,分辨率为800*480为例,因为屏不同方向和分辨率使用的资源是不一样的,下面先来看下修改前后的对比图 修改前是4x4: 修改后是3x5: 修改的文件有layout-land...
  • deng0zhaotai
  • deng0zhaotai
  • 2015年11月04日 10:04
  • 2415

Redis4.0源码解析--动态字符串SDS

笔者博客地址:https://charpty.com/blog Redis官方在2016年12月发布了4.0-rc1版本,从此揭开了4.0版本的序幕,但到目前为止(2017年6月)还没有正式发布4...
  • zstu_cc
  • zstu_cc
  • 2017年06月11日 15:25
  • 327

Android Launcher3源码分析与修改

最近两天改一个客户需求改得挺耗时,多数都用在了WallpaperCropActivity这个文件中。今天就顺带分析一下这个文件。 路径:packages/apps/Launcher3/src/co...
  • zhoumushui
  • zhoumushui
  • 2014年11月07日 19:05
  • 17855
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 4.0 Launcher源码分析系列(一)
举报原因:
原因补充:

(最多只允许输入30个字)