添加自定义UI组件作为面板titleIcon(应该很容易,我是一个新手)

时间:2009-12-28 22:20:25

标签: flex class actionscript panel

这个概念看起来很简单,但是我很难做到正确,找不到任何可以帮助我的事情。

我有一个我需要执行拖放操作的面板,但我只想在用户按下面板的特定区域时执行该操作。我可以通过这样做为面板添加一个Icon:

[Embed("/img/icon.png")]
[Bindable]
public var dragIcon:Class;

newPanel.titleIcon = dragIcon;

但是我真正想要添加的是一个盒子,然后我可以添加我的听众来拖放鼠标,就像我在动作脚本中创建的一些画布一样,

var tempBox:Box = new Box;
tempBox.x=0;
tempBox.y=0;
tempBox.width = 20;
tempBox.height = 44;
tempBox.setStyle("horizontalAlign","center");
tempBox.setStyle("verticalAlign","middle");
tempBox.addEventListener(MouseEvent.ROLL_OVER,over);
tempBox.addEventListener(MouseEvent.ROLL_OUT,out);
tempBox.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownAnswer);
var tempImg:Image = new Image();
tempImg.source = grabbableItem;
tempBox.addChild(tempImg);
myCanvas.addChild(tempBox);

那么我需要做些什么来使用tempBox并将其转换为一个类用作我的面板titleIcon?

编辑12/29/09: 所以我想出了一些我正在扩展面板类的东西(如下所示),但所有这些都是用我可以公开访问的东西覆盖图标。我确定那里有更好的方法吗?

package custClass
{
    import mx.containers.Box;
    import mx.containers.Panel;
    import mx.controls.Image;

    public class DragPanel extends Panel
    {
        [Bindable] public var iconBox:Box = new Box();

        [Embed("../img/doc_page.png")] [Bindable] public var grabbableItem:Class;

        public function DragPanel()
        {
            super();
        }
        override protected function createChildren():void{
            super.createChildren();

            iconBox.x = 10
            iconBox.y = 4
            iconBox.width = 20;
            iconBox.height = 20;
            iconBox.setStyle("horizontalAlign","center");
            iconBox.setStyle("verticalAlign","middle");
            iconBox.setStyle("borderStyle","solid");
            iconBox.setStyle("backgroundColor",0x000000);
            var tempImg:Image = new Image();
            tempImg.source = grabbableItem;
            iconBox.addChild(tempImg);
            this.rawChildren.addChild(iconBox);
        }
    }
}

编辑1/7/10(或根据我的Windows手机短信16): 从下面使用Chaims帮助是我的新答案。

创建一个像Chaim所说的框mxml组件,但也要添加以下脚本块。

<mx:Script>
        <![CDATA[
            import mx.core.Application;
            [Embed("/img/doc_page.png")]
            [Bindable]
            public var grabbableItem:Class;

            public function init():void{
                this.addEventListener(MouseEvent.MOUSE_DOWN,Application.application.mouseDownSection);
                this.addEventListener(MouseEvent.ROLL_OVER,Application.application.over);
                this.addEventListener(MouseEvent.ROLL_OUT,Application.application.out);
            }
        ]]>
    </mx:Script>

这会在Box上添加我想要的所有事件监听器,用作我的图标。现在只需将该框添加为图标,就可以了。

panel.titleIcon = DraggableBox;

我猜因为它是一个单独的mxml组件,所以它现在是一个类,但我不认为我理解为什么。

1 个答案:

答案 0 :(得分:1)

Panel希望titleIcon属性值为IFactory并自己创建一个实例。

让你的盒子成为一个组件(让我们把它命名为DraggableBox.mxml):

<?xml version="1.0" encoding="utf-8"?>
<mx:Box xmlns:mx="http://www.adobe.com/2006/mxml"
    x="0" y="0" width="20" height="44"
    horizontalAlign="center" verticalAlign="middle">
    <mx:Image source="{grabbableItem}"/>
</mx:Box>

并将其分配给titleIcon:

<mx:Panel titleIcon="{DraggableBox}" >
...
</mx:Panel>

如果您想在ActionScript中使用ClassFactory:

panel.titleIcon = new ClassFactory(DraggableBox);