`

launcher中celllayout类简单分析

阅读更多
1) 大家都知道workspace是有celllayout组成。Celllayout被划分为了4行4列的表格,用Boolean类型的mOccupied二维数组来标记每个cell是否被占用。在attrs.xml中定义了shortAxisCells和longAxisCells分别存储x轴和y轴方向的cell个数。在Celllayout构造函数中初始化。
2) 内部类CellInfo为静态类,实现了ContextMenu.ContextMenuInfo接口。其对象用于存储cell的基本信息。
 VacantCell类用于存储空闲的cell,用到了同步机制用于管理对空闲位置的操作。所有的空cell都存储在vacantCells中。
 cellX和cellY用于记录cell的位置,起始位0。如:(0,0) (0,1),每一页从新开始编号。
 clearVacantCells作用是将Vacant清空:具体是释放每个cell,将list清空。
 findVacantCellsFromOccupied从存放cell的数值中找到空闲的cell。在Launcher.Java中的restoreState方法中调用。
3) mPortrait用于标记是横屏还是竖屏,FALSE表示竖屏,默认为FALSE。
4) 修改CellLayout页面上cell的布局:
 CellLayout页面上默认的cell为4X4=16个,可以通过修改配置文件来达到修改目的。
 在CellLayout.Java类的CellLayout(Context context, AttributeSet attrs, int defStyle)构造方法中用变量mShortAxisCells和mLongAxisCells存储行和列。
 其值是在自定义配置文件attrs.xml中定义的,并在workspace_screen.xml中赋初值的,初值都为4,即4行、4列。可以在workspace_screen.xml修改对应的值。
 注意:CellLayout构造方法中从attrs.xml中获取定义是这样的:mShortAxisCells = a.getInt(R.styleable.CellLayout_shortAxisCells, 4);当workspace_screen.xml中没有给定义的变量赋值时,上面的4就起作用。
5)下面的分析转载自:http://blog.csdn.net/netpirate/archive/2009/06/05/4245445.aspx
Launcher(主屏/待机) App的BUG: 没有初始化定义CellLayout中屏幕方向的布尔值参数
Launcher App:\cupcake\packages\apps\Launcher
待机画面分为多层,桌面Desktop Items在\res\layout-*\workspace_screen.xml中置:
<com.android.launcher.CellLayout
... ...
    launcher:shortAxisCells="4"
    launcher:longAxisCells="4"
... ...
/>
表示4行4列
再看看 com.android.launcher.CellLayout ,其中有定义屏幕方向的参数,
private boolean mPortrait;
但是一直没有初始化,也就是mPortrait=false,桌面的单元格设置一直是以非竖屏(横屏)的设置定义进行初始化。
再来看看横屏和竖屏情况下的初始化不同之处,就可以看出BUG了。
boolean[][] mOccupied;//二元单元格布尔值数组
            if (mPortrait) {
                mOccupied = new boolean[mShortAxisCells][mLongAxisCells];
            } else {
                mOccupied = new boolean[mLongAxisCells][mShortAxisCells];
            }
如果我们满屏显示桌面(横向和纵向的单元格数不一致),而不是默认的只显示4行4列,则mShortAxisCells = 4, mLongAxisCells = 5,数组应该初始化是:new boolean[4][5],但是实际是按照非竖屏处理,初始化成了new boolean[5][4],会产生数组越界异常。
可以在构造函数中,添加通过屏幕方向初始化mPortrait,代码如下:
public CellLayout(Context context, AttributeSet attrs, int defStyle)
{
        super(context, attrs, defStyle);
        mPortrait = this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;// 新增代码

... ...
4
0
分享到:
评论
1 楼 mxs812 2011-12-16  
学习,谢谢

相关推荐

    android CellLayout布局简单实现

    仿照Launcher简单实现一下CellLayout布局方式,可以通过手动点击的方式往特定的栅格中放入一张图片,请大家不吝赐教,相关说明移步博客http://blog.csdn.net/program_thinker/article/details/40265169

    Android_launcher源码全面分析

    数据的存储是通过一个或多个SQLite数据库来实现的, Launcher中有专门的数据库辅助类来处理与数据库相关的操作。 通过上述内容,我们系统性地分析了Launcher应用的核心实现,从界面配置到启动流程,再到数据处理和...

    android2.3 launcher分析三

    【Android 2.3 Launcher 分析】 Android 2.3 的 Launcher 是用户界面的核心部分,它作为设备的主要入口,提供用户访问应用程序、小部件和设置的界面。在深入分析之前,我们先了解一下 Launcher 的基本架构。 **...

    android Launcher2文件夾功能分析

    **Android Launcher2 文件夹功能分析** 在Android操作系统中,Launcher是用户界面的核心组成部分,它扮演着桌面的角色,允许用户启动应用程序、创建快捷方式以及管理主屏幕上的图标布局。`Launcher2`是Android早期...

    Android_launcher的源码详细分析.pdf

    该源码分析了 Android_launcher 的主要组件和类,包括 Launcher.java、DragLayer.java、DragController.java、LauncherModel.java、Workspace.java、LauncherProvider.java、CellLayout.java、ItemInfo.java、User...

    Android Launcher抽屉类SlidingDrawer的使用

    在Android系统中,Launcher是用户界面的核心组成部分,它负责展示应用程序的快捷方式和主屏幕小部件,让用户体验到个性化和便捷的操作。而SlidingDrawer组件是Android SDK提供的一种交互控件,它允许开发者在界面中...

    拆解Launcher中的WorkSpace实现左右滑动效果

    在Android开发中,Launcher是用户接触系统的第一个界面,它通常包含主屏幕(也称为工作区WorkSpace)和其他应用快捷方式。工作区的左右滑动效果是Android Launcher的一个核心功能,让用户能够轻松地在不同的主屏幕...

    android Launcher2.2源码

    1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、Service、BroadcastReceiver以及ContentProvider。其中,主Activity是整个应用的核心,它负责加载并显示桌面图标和应用抽屉。源码中的`...

    launcher类

    在Android系统中,`launcher`类扮演着至关重要的角色,它是用户与系统界面交互的入口,也就是我们常说的桌面应用。通常,`launcher`是系统启动的第一个Activity,它负责显示应用快捷方式、小部件以及主屏幕。理解`...

    launcher源码分析

    在本文中,我们将深入分析`launcher`源码,特别是`Launcher3`项目,来理解其工作原理和设计思路。 首先,我们来看`Launcher3`的主要组件。`Launcher3`是Android开源项目中的一个版本,它主要由以下几个关键部分构成...

    android2.3 launcher分析

    ### Android 2.3 Launcher分析 #### 架构概述 Android 2.3 版本中的Launcher采用的是经典的MVC(Model-View-Controller)架构模式。这种模式将应用程序分为三个核心部分:模型(Model)、视图(View)以及控制器...

    Launcher2源码分析

    《Launcher2源码分析》 在Android系统中,Launcher作为用户与系统交互的起点,扮演着至关重要的角色。本文将深入探讨Android 4.0版本的Launcher2源码,主要涉及桌面快捷图标的拖拽机制、Workspace切换到AllApps流程...

    Android代码-Launcher3

    Launcher3中的常用类 Launcher3的启动流程(一) 细说ItemInfo Launcher3的启动流程(二) Launcher3分析之拖动图标的流程——按下 Launcher3分析之拖动图标的流程——移动 Launcher3分析之拖动图标的流程——放下 ...

    launcher启动流程类图

    介绍了launcher启动时各个类之间的调用次序。

    android的launcher分析.pdf

    Android Launcher 的架构和实现进行分析,主要包括 Launcher 的主要文件和类、DragLayer 的实现、DragController 的作用、LauncherModel 的数据库操作、Workspace 的抽象、LauncherProvider 的数据库存储、...

    launcher2 pagedview 分析

    《Android Launcher2中的PagedView分析》 在Android系统中,Launcher是用户界面的核心部分,它为用户提供了一个可自定义的主屏幕,其中包括各种应用程序、快捷方式和小部件。而`PagedView`是`Launcher2`中的一个...

    android的launcher分析--详细

    本篇文章将深入分析Android 2.1版本的Launcher2,并探讨其核心组件和功能。 1. **Launcher.java**: 这是Launcher的主要Activity,负责整个启动器的生命周期管理和界面布局。它初始化并管理其他关键组件,如...

    android桌面Launcher2

    4. **布局管理**:使用`Workspace`和`CellLayout`类来组织和管理桌面的网格布局,允许用户自定义屏幕数量和每个屏幕上的图标排列。 5. **动画和过渡效果**:Android的动画框架在Launcher2中用于提供滑动屏幕、添加/...

    android2.3 launcher分析二

    本文将深入探讨Android 2.3版本中的Launcher系统,并重点分析LiveFolder的功能及其如何与Launcher交互,以及Launcher默认界面配置的方式和方法。 #### LiveFolder概述 LiveFolder作为Android 2.3系统中的一个重要...

Global site tag (gtag.js) - Google Analytics