使用[Inspectable]构建对象检查器IN flex

时间:2012-02-07 18:06:11

标签: flash actionscript-3 flex

我正在构建一个小工具,让用户可以在屏幕上放置一些几何图形,然后移动它们并更改它们的属性。我对as3 / flex很新。

数字在as3中表示为对象。所以我们得到了具有不同属性的Circle,Triangle,Rectangle类。

我喜欢做的是在用户选择图形时显示某种“对象检查器”。此检查器窗口类似于许多IDE中的类似内容。

现在的问题是:是否可以利用as3 [Inspectable]标签获取属性列表并在运行时更改它们?

如果不可能,那么如果不编写特定类型的代码来编辑每个对象,你将如何解决这个问题呢?

修改

只是澄清一下。考虑这个例子:

public class Shape { /* ... */ }

public class Triangle extends Shape { 
  public var a:Number;
  public var h:Number;
  //...
}

public class Circle extends Shape {
  public var r:Number;
  public var name:String;
  //...
}

我想让用户能够从a编辑hTriangle,从r编辑nameCircle。< / p>

从我现在的想象,我可以遵循两条路:

  1. TriangleCircle实施IMyInspectable并为每种类型编写自定义getProperties():DictionarygetProperty(name:String):ObjectsetProperty(name:String, value:Object):void方法。这将涉及完全不优雅的开关意大利面。

  2. 我在输入第一个解决方案时忘记了。 :(

1 个答案:

答案 0 :(得分:1)

我认为您可以使用describeType来内省对象。不过,我可能采取一种非常不同的方法。

创建一个接口,类似于IObjectIWantToCreatePropertyWindowFor,让相关的形状对象实现这一点。界面可以某种方式定义您想要在对象上编辑的属性列表。我甚至可以将这个包含属性名称,显示名称和它应该具有的编辑器类型的值对象数组。每个对象都可以对其中的此属性列表进行硬编码。

可以根据接口值编写属性窗口以重绘自身。很可能我会使用带有itemRendererfunction的List类以某种方式执行此操作。

你想做的事情听起来并不难,但也不是微不足道的。


Nooga要求更详细的解释。这都是伪代码,但是:

1)创建一个界面:

package com.propertyInspector
{

    public interface IPropertyInspectable
    {

        function get inspectableProperties(  ):array;
    }
}

2)创建一个实现IPropertyInspectable

的类
package com.propertyInspector
{

    public class myClass implements IPropertyInspectable
    {

        public var property1 :String
        public var property2 : Int

        public function get inspectableProperties():Array{
          return [{name:'property1',type:'String'},{name:'property2',type:'String'}, ]
        }
    }
}

3)创建属性检查器。

<s:List dataProvider="{someSelectedObjectThatImplementsIPropertyInspectable.inspectableProperties}">
 <s:itemRenderer>
   <s:Label text="data.name"/><s:TextInput />
 </s:itemRenderer>
</s:List>

您必须弄清楚如何将对象传递给属性检查器。 inspectableProperties中的属性对象可能需要引用它们引用的实际对象,以便List可以显示默认值。

您可以使用itemRenderer函数根据类型显示不同的可编辑方法。一个用于字符串的TextInput,一个用于数字的NumericStepper,等等。