【问题标题】:Using [Inspectable] to build object inspector IN flex使用 [Inspectable] 构建对象检查器 IN flex
【发布时间】:2012-02-07 18:06:10
【问题描述】:

我正在构建一个小工具,让用户可以在屏幕上放置一些几何图形,然后移动它们并更改它们的属性。我对 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;
  //...
}

我想让用户能够从Triangler 编辑ahrnameCircle

根据我现在的想象,我可以走两条路:

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

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

【问题讨论】:

  • 你不能用创可贴修复刀伤。
  • 我发现了这个:negush.net/blog/listing-the-properties-of-an-object 问题是它不适合我:[
  • 我的应用程序的运行时当然。 “那么至少选择一个不同的标签”什么标签? :) 我的主要问题是我不知道如何实现这样的东西,更不用说为它制作标签了。

标签: flash actionscript-3 apache-flex


【解决方案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 等等。

【讨论】:

  • 我认为 describeType 在这里会有点过分。我认为最优雅的解决方案不是为每种类型编写代码。这就是这里的问题:(
  • @nooga 使用您对使用 Inspectable 元数据的建议;我认为 describeType 是在运行时获取自定义元数据的唯一方法。你是在建议替代品吗?我相信我的“接口方法”允许您对任何给定类型使用相同的“属性检查器”。您必须为每个“对象”编写的代码将“尽可能复杂”。
  • 同意 flextras,在这种情况下没有理由使用元数据或注释,我看不到它没有任何好处。如果您必须为每种类型编写注释来描述属性和潜在值,那么如果您在自己的对象中而不是在元数据中这样做有什么区别?使用“Inspectable”对象的接口应该只是让它返回属性/值对象的集合,您甚至可以轻松地重用特定属性/值对象的定义,而不是通过执行它来创建重复元数据。
  • 你能提供一个简短的例子吗?恐怕我不完全理解 flextras 方法:(
  • @nooga 我编辑了我的答案以添加一些伪代码,希望能更好地解释这种方法。如果您需要更多,我可以作为一名顾问聘请。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2020-10-26
  • 2013-12-11
相关资源
最近更新 更多