Actionscript 3 如何在AS3 DataGrid CellRenderer中获取列宽?
我有一个DataGrid,其中一列显示图片图标。这是通过使用特殊的CellRenderer完成的。是否可以在CellRenderer中找到列宽Actionscript 3 如何在AS3 DataGrid CellRenderer中获取列宽?,actionscript-3,flash,apache-flex,datagrid,air,Actionscript 3,Flash,Apache Flex,Datagrid,Air,我有一个DataGrid,其中一列显示图片图标。这是通过使用特殊的CellRenderer完成的。是否可以在CellRenderer中找到列宽this.width总是返回一个明显错误的数字(152),无论实际列宽是多少。我在PC和Android上都试过了 我需要知道列宽以使图片居中。可能可以使用静态变量将实际列宽传递给CellRenderer,但我想知道我是否忽略了一些明显的东西 import fl.controls.listClasses.CellRenderer; import flash.
this.width
总是返回一个明显错误的数字(152),无论实际列宽是多少。我在PC和Android上都试过了
我需要知道列宽以使图片居中。可能可以使用静态变量将实际列宽传递给CellRenderer,但我想知道我是否忽略了一些明显的东西
import fl.controls.listClasses.CellRenderer;
import flash.geom.Point;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.utils.*;
import flash.events.*;
public class CustomImageCellRenderer extends CellRenderer
{
public function CustomImageCellRenderer()
{
var iconClass : Class = getDefinitionByName("icon") as Class;
var iconMC : MovieClip = new iconClass();
trace("width=" + width); // always returns 152
addChild(iconMC );
}
override protected function drawBackground():void
{
var skin : Object;
if (_listData.index % 2 == 0)
{
skin = CellRenderer_upSkin2;
} else {
skin = CellRenderer_upSkin;
}
setStyle("upSkin", skin);
setStyle("overSkin", skin);
setStyle("downSkin", skin);
setStyle("selectedOverSkin", skin);
setStyle("selectedDownSkin", skin);
setStyle("selectedUpSkin", skin);
super.drawBackground();
}
}
通常,您应该在updateDisplayList中完成所有布局工作-这是您应该获得正确尺寸的地方:
override protected function updateDisplayList(unscaledwidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
icon.x = int((unscaledWidth - icon.width)/2);
}
通常,您应该在updateDisplayList中完成所有布局工作-这是您应该获得正确尺寸的地方:
override protected function updateDisplayList(unscaledwidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
icon.x = int((unscaledWidth - icon.width)/2);
}
在覆盖的牵引地面方法中使用此宽度:
override protected function drawBackground():void
{
super.drawBackground();
trace("width=" + this.width);
}
在覆盖的牵引地面方法中使用此宽度:
override protected function drawBackground():void
{
super.drawBackground();
trace("width=" + this.width);
}
也许你应该在添加addChild()之后再做?或者在添加到阶段事件处理程序中?听起来很有趣。我如何在CellRenderer中执行此操作?也许您应该在添加addChild()后执行此操作?或者在添加到阶段事件处理程序中?听起来很有趣。在CellRenderer中我该怎么做呢?听起来不错,但是我得到了
1020:标记为override的方法必须重写另一个方法。
对不起,因为问题被标记为“Flex”,我假设您使用的是Flex DataGrid,我很抱歉造成混淆。我认为,只要我包含Flex库,编译应用程序所使用的IDE并不重要。你是说我需要迁移到Flash Builder以覆盖updateDisplayList()?是的,updateDisplayList是FLex生命周期的一部分,用于在组件中定位各种内容。但您是否尝试过使用addEventListener(Event.ADDED_TO_STAGE,on_addedStatage)使用Nemi的解决方案;?我尝试了_addedStatage(),但它显示的宽度相同。我最终使用了一个丑陋的静态函数,它只将实际列宽传递给CellRenderer。这个Flex的东西让人困惑:)这听起来不错,但我得到了1020:标记为override的方法必须覆盖另一个方法。
对不起,因为这个问题被标记为“Flex”,我假设您使用的是Flex DataGrid,我为这一困惑感到抱歉。我认为,只要我包含Flex库,编译应用程序所使用的IDE并不重要。你是说我需要迁移到Flash Builder以覆盖updateDisplayList()?是的,updateDisplayList是FLex生命周期的一部分,用于在组件中定位各种内容。但您是否尝试过使用addEventListener(Event.ADDED_TO_STAGE,on_addedStatage)使用Nemi的解决方案;?我尝试了_addedStatage(),但它显示的宽度相同。我最终使用了一个丑陋的静态函数,它只将实际列宽传递给CellRenderer。这个Flex的东西让人困惑:)谢谢你的代码!1) 我在添加的statage()上尝试了
。它显示了相同的宽度(152),结果是皮肤MC的宽度。2) createChildren()
生成错误:“020:标记为override的方法必须重写另一个方法。”。我想这意味着我没有包括一些东西,但这很奇怪,因为CellRenderer可以工作。完成。顺便说一句,我正在用Animate CC编译。哦,等一下,你在用纯动作脚本吗?不知何故,我认为这是一个Flex数据网格,因为它被标记为Flex。那么Nemi解决方案的第一部分(添加到舞台事件监听器)可能会有所帮助?IMHO Flash Builder更好。但是,不要在这里放弃。您是否尝试过parent.width或owner.width?在trackground()中跟踪this.width
,因为在重写方法中,这个是超级类,也许你会得到正确的值。Flash Builder更好,毫无疑问,但我仍然没有机会切换到它:)这个.width
在trackground()中工作!请更新您的答案,以便我可以将其标记为正确。谢谢您的代码!1) 我在添加的statage()上尝试了
。它显示了相同的宽度(152),结果是皮肤MC的宽度。2) createChildren()
生成错误:“020:标记为override的方法必须重写另一个方法。”。我想这意味着我没有包括一些东西,但这很奇怪,因为CellRenderer可以工作。完成。顺便说一句,我正在用Animate CC编译。哦,等一下,你在用纯动作脚本吗?不知何故,我认为这是一个Flex数据网格,因为它被标记为Flex。那么Nemi解决方案的第一部分(添加到舞台事件监听器)可能会有所帮助?IMHO Flash Builder更好。但是,不要在这里放弃。您是否尝试过parent.width或owner.width?在trackground()中跟踪this.width
,因为在重写方法中,这个是超级类,也许你会得到正确的值。Flash Builder更好,毫无疑问,但我仍然没有机会切换到它:)这个.width
在trackground()中工作!请更新您的答案,以便我将其标记为正确。