tree组件默认显示效果是这样的,
设计人员设计的效果是这样的,
仔细对比一下,不难发现两者的区别(设计效果相对于默认效果):
1)去掉了文件夹图标;
2)叶节点向左缩进,和小三角图标是对齐的;
3)图标、文字颜色不同。
关于修改图标和文字颜色,直接用style就可以实现。去掉文件夹图标也可以通过style实现,难点在于如何让叶节点向左缩进。
Tree的style中的indentation只能实现整体的缩进,无法达到想要的效果。然后就想到了用ItemRenderer,新建一个类文件CustomTreeItemRenderer.as 继承TreeItemRenderer,然后设置Tree的itemRenderer="CustomTreeItemRenderer"。CustomTreeItemRenderer.as代码如下。
package
{
import mx.controls.treeClasses.TreeItemRenderer;
import mx.controls.treeClasses.TreeListData;
public class CustomTreeItemRenderer extends TreeItemRenderer
{
public function CustomTreeItemRenderer()
{
super();
}
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var startx:Number = data ? TreeListData( listData ).indent : 0;
if (disclosureIcon)
{
disclosureIcon.x = startx;
disclosureIcon.visible = data ?
TreeListData( listData ).hasChildren :
false;
if(disclosureIcon.visible){
startx = disclosureIcon.x + disclosureIcon.width;
}
disclosureIcon.setActualSize(disclosureIcon.width,
disclosureIcon.height);
}
if (icon)
{
icon.x = startx;
startx = icon.x + icon.measuredWidth;
icon.setActualSize(icon.measuredWidth, icon.measuredHeight);
}
label.x = startx ;
}
}
}关键在于这句:
disclosureIcon.visible = data ?TreeListData( listData ).hasChildren :false;
if(disclosureIcon.visible){
startx = disclosureIcon.x + disclosureIcon.width;
}先设置disclosureIcon的visible属性,有子节点的显示disclosureIcon,没有子节点的,不显示。猜也能猜出来disclosureIcon就是那个文件夹图标。如果文件夹图标显示,startx向右挪,如果文件夹图标不显示,startx就不用向右挪。这样就实现了叶节点和兄弟节点的小三角对齐。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。