Launcher简要分析:Launcher的基本UI构成

本文解析了Android系统Launcher的作用与功能,介绍了Launcher的基本UI构成及其核心组件,如Workspace、CellLayout、DeleteZone等,并概述了它们之间的关系。

在开始之前,有必要简单描述下Launcher的作用和功能。Launcher是Android系统启动后运行的第一个应用,它负责除应用本身操作外的所有操作,包括有几个桌面、点击应用程序图标启动应用程序、长时间按桌面出现上下文菜单、长按桌面图标出现垃圾箱、长按桌面应用程序后可以移动位置和设置壁纸等,添加Widget,设置文件夹等功能。虽然它负责的操作看是很多,但它和普通的应用程序具有一样的权限和应用等级。所以Launcher是可以替换的,开发者可以按照自己的需求设计并实现相关的Launcher应用。一般而言,由于Launcher应用的特殊地位,一般厂商对应用进行定制都会从Launcher开始,第二位的就要说是Setting了.

下面我们就来分析下Launcher的相关内容. 我们分析的Launcher代码为AWD Launcher的开源代码。大家可以在http://code.google.com/p/adw-launcher-android/ 获取到. AWD Launcher的开源代码是在SDK2.0的Launcher代码基础上加工的。所以与系统源代码有一定的延续性。基本的实现机制与思路都是一致的.

Launcher的基本UI构成

要说UI结果,我们采用Hierarchy View工具分析界面可得到如下基本UI结构结构。

2012052503314443.jpg

简单说下: 左边的效果图与右边的结构图是一一对应的。对应布局文件而言,文件结构主要对应于layout-port/launcher.xml布局文件.两者存在对应关系。 上面的UI结构为树形结构最底层的为DragLayer,DragLayer其实为Launcher实现拖拽的基本机制。后续将有分析.


  • 抛开DragLayer不看,我们会发现整个界面是以一个名为Workspace的View容器为基础的。Workspace是继承与ViewGroup的组件,我们看到的每一屏就是一个CellLayout组件,这些CellLayout并排平铺在Workspace上,这样我们在Workspace上面左右拖动的时候就能完成CellLayout的切换了.

Workspace 与 CellLayout的 关系如下:

2012052306357890.png

  • CellLayout实现了屏幕位置的单元格化的管理。 Celllayout被划分为了4行4列的表格,用Boolean类型的mOccupied二维数组来标记每个cell是否被占用。在attrs.xml中定义了shortAxisCells和longAxisCells分别存储x轴和y轴方向的cell个数。在Celllayout构造函数中初始化。CellLayout有除了shortAxisCells 和longAxisCells参数外还有多个参数可以设置。
  • 除了Workspace 中除了CellLayout外还有 AllAppsSlidingView, 默认情况下AllAppsSlidingView为隐藏状态,单点击应用菜单键才会展示,应用展示所有有应用图标的应用。
  • 与Workspace同级的组件还有DeleteZone 和 DockBar,DesktopIndicator。三者分别对应于不同位置的组件.
    • DeleteZone 对应于删除区域,每次长按拖动图标的时候,桌面会显示一个垃圾桶的区域就是DeleteZone
    • DockBar 是个快捷启动组件。他就是截图中最底下的哪个部分。
    • DesktopIndicator对应与截图上部那些个指示当前所在屏幕位置的提示。

上述就是对UI组件各个部分的简要描述。通过这些描述我们大概清楚了Launcher应用大概由那些View元素组成的。这些元素的结构关系是怎么样的。如果我们想修改某个方面的内容,初略的也有了修改的方向。 当然仅仅知道这些初略的东东是远远不够的,我们需要进一步的分析其具体的实现机制。

行 12838: 11-18 20:25:11.633641 3793 3793 I wm_task_created: 1 行 12839: 11-18 20:25:11.634714 3793 3793 I wm_task_windowing_mode_changed: [1,1,1,0] 行 13214: 11-18 20:25:22.827061 3793 7055 I wm_task_created: 2 行 13215: 11-18 20:25:22.827721 3793 7055 I wm_task_windowing_mode_changed: [2,2,1,0] 行 13216: 11-18 20:25:22.830928 3793 7055 I wm_task_created: 3 行 13217: 11-18 20:25:22.831304 3793 7055 I wm_task_windowing_mode_changed: [3,3,1,0] 行 13218: 11-18 20:25:22.832674 3793 7055 I wm_task_windowing_mode_changed: [3,3,6,1] 行 13219: 11-18 20:25:22.836548 3793 5060 I wm_task_created: 4 行 13220: 11-18 20:25:22.836928 3793 5060 I wm_task_windowing_mode_changed: [4,4,1,0] 行 13221: 11-18 20:25:22.837922 3793 5060 I wm_task_windowing_mode_changed: [4,4,6,1] 行 13249: 11-18 20:25:23.613419 3793 5058 I wm_task_removed: [3,3,0,reParentTask:sanitizeAndApplyHierarchyOp] 行 13250: 11-18 20:25:23.615091 3793 5058 I wm_task_moved: [3,2,0,1,2147483647] 行 13251: 11-18 20:25:23.615295 3793 5058 I wm_task_removed: [4,4,0,reParentTask:sanitizeAndApplyHierarchyOp] 行 13252: 11-18 20:25:23.615634 3793 5058 I wm_task_moved: [4,2,0,1,2147483647] 行 13275: 11-18 20:25:24.376218 3793 3793 I wm_task_created: 5 行 13276: 11-18 20:25:24.376479 3793 3793 I wm_task_windowing_mode_changed: [5,1,1,0] 行 13277: 11-18 20:25:24.377492 3793 3793 I wm_task_moved: [5,1,0,1,2147483647] 行 13278: 11-18 20:25:24.380783 3793 3793 I wm_task_moved: [1,1,0,1,1] 行 13279: 11-18 20:25:24.380800 3793 3793 I wm_task_to_front: [0,5,0] 行 13280: 11-18 20:25:24.380970 3793 3793 I wm_create_task: [0,5,1,0] 行 13281: 11-18 20:25:24.380989 3793 3793 I wm_create_activity: [0,47115589,5,com.android.launcher/.Launcher,android.intent.action.MAIN,NULL,NULL,268435712] 行 13282: 11-18 20:25:24.381099 3793 3793 I wm_task_moved: [1,1,0,1,1] 行 13283: 11-18 20:25:24.381118 3793 3793 I wm_task_moved: [5,1,0,1,2147483647] 行 13326: 11-18 20:25:25.109468 3793 8060 I wm_restart_activity: [0,47115589,5,com.android.launcher/.Launcher] 行 13328: 11-18 20:25:25.117671 3793 8060 I wm_set_resumed_activity: [0,com.android.launcher/.Launcher,realStartActivityLocked - onActivityStateChanged] 行 13385: 11-18 20:25:27.674227 8220 8220 I wm_on_create_called: [47115589,com.android.launcher.Launcher,performCreate,1865] 行 13386: 11-18 20:25:27.681101 8220 8220 I wm_on_start_called: [47115589,com.android.launcher.Launcher,handleStartActivity,6] 行 13387: 11-18 20:25:27.694654 8220 8220 I wm_on_resume_called: [47115589,com.android.launcher.Launcher,RESUME_ACTIVITY,12] 行 13392: 11-18 20:25:27.792343 8220 8220 I wm_on_top_resumed_gained_called: [47115589,com.android.launcher.Launcher,topStateChangedWhenResumed] 行 13401: 11-18 20:25:28.254522 3793 7055 I wm_set_requested_orientation: [5,com.android.launcher/.Launcher] 行 13403: 11-18 20:25:28.290370 3793 4008 I wm_wallpaper_surface: [0,1,Window{4cc4cc7 u0 com.android.launcher/com.android.launcher.Launcher},Window{430769e u0 com.android.wallpaper.livepicker.service.moon.MoonWallpaperService}] 行 13412: 11-18 20:25:28.485805 3793 3987 I wm_activity_launch_time: [0,47115589,com.android.launcher/.Launcher,3792] 行 13480: 11-18 20:25:32.456858 3793 8525 I wm_set_keyguard_shown: [0,1,0,0,0,setKeyguardShown] 行 13481: 11-18 20:25:32.460224 8220 8220 I wm_on_top_resumed_lost_called: [47115589,com.android.launcher.Launcher,topStateChangedWhenResumed] 行 13482: 11-18 20:25:32.460294 3793 8525 I wm_pause_activity: [0,47115589,com.android.launcher/.Launcher,userLeaving=false,sleep] 行 13484: 11-18 20:25:32.461578 3793 8525 I wm_add_to_stopping: [0,47115589,com.android.launcher/.Launcher,makeInvisible] 行 13485: 11-18 20:25:32.467986 8220 8220 I wm_on_paused_called: [47115589,com.android.launcher.Launcher,performPause,3] 行 13487: 11-18 20:25:32.499421 3793 4006 I wm_stop_activity: [0,47115589,com.android.launcher/.Launcher] 行 13489: 11-18 20:25:32.501044 3793 4008 I wm_wallpaper_surface: [0,0,Window{4cc4cc7 u0 com.android.launcher/com.android.launcher.Launcher},Window{430769e u0 com.android.wallpaper.livepicker.service.moon.MoonWallpaperService}] 行 13490: 11-18 20:25:32.506335 8220 8220 I wm_on_stop_called: [47115589,com.android.launcher.Launcher,STOP_ACTIVITY_ITEM,5] 行 13515: 11-18 20:25:34.040773 3793 4008 I wm_wallpaper_surface: [0,1,Window{afc0685 u0 NotificationShade},Window{5f0b94a u0 com.android.systemui.wallpapers.ImageWallpaper}] 行 13523: 11-18 20:25:34.233973 3793 4006 I wm_boot_animation_done: 86914 行 13767: 11-18 20:25:43.921122 3793 9583 I wm_task_created: 53637 行 13768: 11-18 20:25:43.927376 3793 9583 I wm_task_created: 53645 行 13769: 11-18 20:25:43.928179 3793 9583 I wm_task_created: 53640 行 13770: 11-18 20:25:43.928643 3793 9583 I wm_task_created: 53642 行 13771: 11-18 20:25:43.929026 3793 9583 I wm_task_created: 53653 行 13772: 11-18 20:25:43.929432 3793 9583 I wm_task_created: 53666 行 13773: 11-18 20:25:43.929759 3793 9583 I wm_task_created: 53649 行 13774: 11-18 20:25:43.930057 3793 9583 I wm_task_created: 53652 行 13775: 11-18 20:25:43.930330 3793 9583 I wm_task_created: 53655 行 13776: 11-18 20:25:43.930594 3793 9583 I wm_task_created: 53656 行 13777: 11-18 20:25:43.930901 3793 9583 I wm_task_created: 53657 行 13778: 11-18 20:25:43.931165 3793 9583 I wm_task_created: 53660 行 13779: 11-18 20:25:43.931406 3793 9583 I wm_task_created: 53669 行 13780: 11-18 20:25:43.931621 3793 9583 I wm_task_created: 53672 行 13781: 11-18 20:25:43.931861 3793 9583 I wm_task_created: 53675 行 13782: 11-18 20:25:43.932154 3793 9583 I wm_task_created: 53676 行 13783: 11-18 20:25:43.941494 3793 7662 I wm_set_keyguard_shown: [0,1,0,1,0,keyguardGoingAway] 行 13784: 11-18 20:25:43.947790 3793 7662 I wm_set_resumed_activity: [0,com.android.launcher/.Launcher,resumeTopActivity - onActivityStateChanged] 行 13785: 11-18 20:25:43.954585 3793 7662 I wm_resume_activity: [0,47115589,5,com.android.launcher/.Launcher] 行 13787: 11-18 20:25:43.980333 8220 8220 I wm_on_restart_called: [47115589,com.android.launcher.Launcher,performRestart,0] 行 13788: 11-18 20:25:43.987866 8220 8220 I wm_on_start_called: [47115589,com.android.launcher.Launcher,handleStartActivity,7] 行 13789: 11-18 20:25:43.997826 8220 8220 I wm_on_resume_called: [47115589,com.android.launcher.Launcher,RESUME_ACTIVITY,9] 行 13790: 11-18 20:25:43.998069 8220 8220 I wm_on_top_resumed_gained_called: [47115589,com.android.launcher.Launcher,topWhenResuming] 行 13793: 11-18 20:25:44.167541 3793 4008 I wm_wallpaper_surface: [0,1,Window{4cc4cc7 u0 com.android.launcher/com.android.launcher.Launcher},Window{430769e u0 com.android.wallpaper.livepicker.service.moon.MoonWallpaperService}] 行 13841: 11-18 20:25:45.712541 3793 4043 I wm_set_keyguard_occluded: [0,0,0,setOccluded] 行 13843: 11-18 20:25:45.719776 3793 4008 I wm_wallpaper_surface: [0,0,Window{4cc4cc7 u0 com.android.launcher/com.android.launcher.Launcher},Window{5f0b94a u0 com.android.systemui.wallpapers.ImageWallpaper}] 行 13859: 11-18 20:25:45.785655 3793 3923 I wm_set_keyguard_shown: [0,0,0,1,0,setKeyguardShown] 行 14143: 11-18 20:25:52.304452 3793 9583 I wm_task_created: 53674 手机在干嘛
最新发布
12-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值