Actionscript 3 如何在AS3 DataGrid 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.

我有一个DataGrid,其中一列显示图片图标。这是通过使用特殊的CellRenderer完成的。是否可以在CellRenderer中找到列宽
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()中工作!请更新您的答案,以便我将其标记为正确。