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;// 新增代码 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值