您的位置:首页 > 其它

老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 5

2016-01-07 17:28 369 查看
看这段代码之前还是请回到“图13-6-1 NotesList控件列表”中重温一下一个控件的每个属性名和值是怎么组织起来的:

android.widget.FrameLayout@41901ab0 drawing:mForeground=4,null

padding:mForegroundPaddingBottom=1,0 padding:mForegroundPaddingLeft=1,0

padding:mForegroundPaddingRight=1,0 padding:mForegroundPaddingTop=1,0

drawing:mForegroundInPadding=4,true measurement:mMeasureAllChildren=5,false

drawing:mForegroundGravity=3,119 events:mLastTouchDownTime=1,0 events:mLastTouchDownY=3,0.0 events:mLastTouchDownX=3,0.0 events:mLastTouchDownIndex=2,-1 mGroupFlags_CLIP_CHILDREN=3,0x1 mGroupFlags_CLIP_TO_PADDING=3,0x2 mGroupFlags=7,2244691 layout:mChildCountWithTransientState=1,0 focus:getDescendantFocusability()=24,FOCUS_BEFORE_DESCENDANTS drawing:getPersistentDrawingCache()=9,SCROLLING drawing:isAlwaysDrawnWithCacheEnabled()=4,true isAnimationCacheEnabled()=4,true drawing:isChildrenDrawingOrderEnabled()=5,false drawing:isChildrenDrawnWithCacheEnabled()=5,false bg_=4,null layout:mLeft=1,0 measurement:mMeasuredHeight=3,690 measurement:mMeasuredWidth=3,480 measurement:mMinHeight=1,0 measurement:mMinWidth=1,0 drawing:mLayerType=4,NONE padding:mPaddingBottom=1,0 padding:mPaddingLeft=1,0 padding:mPaddingRight=1,0 padding:mPaddingTop=1,0 mID=10,id/content mPrivateFlags_DRAWING_CACHE_INVALID=3,0x0 mPrivateFlags_DRAWN=4,0x20 mPrivateFlags=11,-2130703184 layout:mRight=3,480 scrolling:mScrollX=1,0 scrolling:mScrollY=1,0 layout:mBottom=3,800

我们就以其中的一个属性”layout:mBottom=3,800”做为例子来解析一下它的格式:

等号之前:控件属性名称,它是由两部分组成的,用冒号隔开,冒号之前代表该属性的类型,后面是属性的名称。实例中是”layout:mBottom”,其中layout代表这个是一个布局类的属性,也属于属性名的一部分

等号之后逗号之前:属性值的字节长度,在这里是3,因为后面的属性值800做为字串的话刚好占了3个字节

逗号之后:属性值,在这里是800,代表这个控件的最下面部分的Y坐标是800

知道属性的格式就好去理解代码14-8-7所做的事情了:

首先外层一个while循环去分析每一个属性

找到等号的位置,然后取出等号之前的控件属性名字

找到逗号的位置,然后取出等号之后到逗号之前的控件属性值的长度

找到控件属性值的位置和控件属性值结束的位置,然后取出它们之间的控件属性值

把该控件属性加入到properties列表里面保存起来

把该控件属性名称和属性值加入namedProperties这个映射里面保存起来

进入下一个循环解析下一个属性值,直到一行控件信息的长度尽头就跳出循环

分析完loadProperties的第一部分后,我们继续往下看:

private void loadProperties(String data) {

...

Collections.sort(this.properties, new Comparator()

{

  public int compare(ViewNode.Property source, ViewNode.Property destination) {

  return source.name.compareTo(destination.name);

}

});

...

代码14-8-10 ViewNode-loadProperties-属性列表排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: