launcher中celllayout类简单分析

简介: 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)下面的分析转载自:https://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;// 新增代码
... ...
相关文章
|
存储 JSON 监控
APM监控 · 入门篇 · Android端测监控平台建设(1)
APM 全称 Application Performance Management & Monitoring (应用性能管理/监控) 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿、响应速度慢、发热严重、流量电量消耗大等问题的时候,很可能就会卸载掉我们的 App。这也是我们在目前工作中面临的巨大挑战之一,尤其是低端机型。
4379 0
APM监控 · 入门篇 · Android端测监控平台建设(1)
|
Android开发
解决圆形进度条ProgressBar的几个问题
Android自带的Progressbar默认就是圆形的,可以通过设置style属性 style="?android:attr/progressBarStyleHorizontal" 复制代码 这样就能变成条状进度条,如下: <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal"/>
1662 0
|
Java Apache
Apache PDFbox快速开发指南
一、介绍 Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。
2530 0
|
7月前
|
Java 编译器 数据安全/隐私保护
Java 大学期末考试真题与答案 含知识点总结 重难点归纳及题库汇总 Java 期末备考资料
本文汇总了Java大学期末考试相关资料,包含真题与答案、知识点总结、重难点归纳及题库,涵盖Java基础、面向对象编程、异常处理、IO流等内容,并提供完整代码示例与技术方案,助你高效复习备考。
758 3
|
9月前
|
传感器 存储 Java
Android 3D效果的实现
本文详细讲解了如何在Android中实现3D效果,基于官方Demo并结合实际需求进行调整。通过传感器(Sensor)获取设备旋转数据,利用OpenGL ES绘制3D立方体,实现了动态旋转的视觉效果。文章分为需求分析、效果展示、实现步骤及源码解析,涵盖传感器注册与注销、OpenGL核心方法使用等内容,适合初学者学习参考。文末附完整代码,便于实践操作。
296 0
Android 3D效果的实现
|
Java Android开发 UED
理解SurfaceFlinger在Android中的作用
理解SurfaceFlinger在Android中的作用
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
432 15
|
Java Android开发
Android 长按电源键弹出的GlobalActions菜单
Android 长按电源键弹出的GlobalActions菜单
518 1
|
存储 关系型数据库 数据库
RDS(Relational Database Service)性能瓶颈
RDS(Relational Database Service)性能瓶颈
403 4

热门文章

最新文章