- 浏览: 242983 次
- 性别:
- 来自: ph
文章分类
最新评论
-
zrj_software:
说了等于没说,LZ能否把DLL代码给我研究下啊30729375 ...
如何在Delphi中调用.Net编写的DLL中的函数 -
reyesyang:
正在查找ruby单例模式相关资料,很有帮助,谢谢。
ruby中的单例模式 -
chaochao_pc:
您好,您的通讯工具能传输文件吗? 我在上边好像没找到!!! ...
Silverlight Socket 实现收发信息 -
huaxia524151:
谢谢,解决问题。return self.name.encode ...
Django笔记5(管理站点) -
yahon:
在flash中如何获取呢?
Flash+html--网页向FLASH传递参数
这是一个很好用的技术,我已经在As3中使用它好长一段时间了。使用之前最基本的条件是,你已经知道了类的名字和所属包的的路径,这样就可以轻而易举的在运行时创建类。那么为什么需要这么做呢?有两种情况:一是你有从外部的swf导入的类,二是你已经编译了所有的类,却还想按照XML的配置改变其中的一些类,又不想重新编译。当你用一种CMS生成了你的站点,那么这也是一个非常好用的技术。想象一下,可以把类用于CMS的一段中(a section in the CMS),并且允许编辑从一套“类模板”中选取所需要的。现在,我们有一些在某些地方使用的例子,一起看看我们是如何轻松实现它的。
第一步:创建一个测试类
第一件事情,我们需要做的是创建一个测试类。在你的项目中,创建一个包路径为com.flashartofwar.example的类,如下所示:
- package com.flashartofwar.example {
- import flash.display.Sprite;
- /**
- * @author jessefreeman
- */
- public class RedBox extends Sprite {
- protected var _width:Number = 0;
- protected var _height:Number = 0;
- /**
- * We override the public setter for width so we can redraw
- * the box when the width is changed.
- */
- override public function set width(value : Number) : void {
- _width = value;
- trace("Width", super.width);
- redraw();
- }
- override public function get width() : Number {
- return _width;
- }
- /**
- * We override the public setter for width so we can redraw
- * the box when the width is changed.
- */
- override public function set height(value : Number) : void {
- _height = value;
- redraw();
- }
- override public function get height() : Number {
- return _height;
- }
- public function RedBox() {
- width = 100;
- height = 100;
- redraw();
- }
- /**
- * This simply clears the graphics and redraws the box based
- * on the new width and height.
- */
- public function redraw():void
- {
- graphics.clear();
- graphics.beginFill(0xFF0000);
- graphics.drawRect(0, 0, width, height);
- graphics.endFill();
- }
- }
- }
就像你看到的,这个基本的类继承了Sprite,并添加了管理width/height的自定义逻辑,还画了一个shape。我不愿将更多的时间花费在这个类上,它只是一个最基本的例子,任何的类都可以在这里良好的运行。
第2步:建立一个Doc类
现在我们需要一个文档类,来测试我们的RedBox类是否工作。
- package {
- import flash.display.StageAlign;
- import flash.display.StageScaleMode;
- import com.flashartofwar.example.RedBox;
- import flash.display.Sprite;
- /**
- * @author jessefreeman
- */
- public class DynamicClassDemo extends Sprite {
- public function DynamicClassDemo() {
- configureStage();
- createRedBox();
- }
- private function configureStage() : void {
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.align = StageAlign.TOP_LEFT;
- }
- private function createRedBox() : void {
- var redBox:RedBox = new RedBox();
- redBox.width = 100;
- redBox.height = 100;
- redBox.x = redBox.y = 10;
- addChild(redBox);
- }
- }
- }
同样,这个类也没什么特殊的。我设定了下stage,并建立一个可以创建RedBox的类。如果你运行下,你会看到一个100×100的红色的盒子。到这为止呢,所有的事情看起来都是这么的正确。
第三步:使用getDefinitionByName
接下来,让我们尝试下动态创建RedBox类。我将要使用到一个叫做getDefinitionByName的包方法,它可以通过完整的包路径和类名来查找某个类。把createRedBox方法用以下的代码替换。
- private function createRedBox() : void {
- var tempClass : Class = getDefinitionByName("com.flashartofwar.example.RedBox") as Class;
- var redBox:RedBox = new tempClass();
- redBox.width = 100;
- redBox.height = 100;
- redBox.x = redBox.y = 10;
- addChild(redBox);
- }
你也要导入如下:
- import flash.utils.getDefinitionByName;
好,注意到了吗?我们这里只是简单地用new tempClass()替换了new RedBox(),并在这行之前使用了getDefinitionByName方法。只有这一点改变。我们建立了一个Class类型的持有变量,然后用getDefinitionByName返回了一个com.flashartofwar.example.RedBox类的实例。一旦我们有了一个类自己的引用,那么我们就可以简单地创建新的实例。灵巧的技巧,对吧?同样,我们若不使用As3自己的internal类去到系统里找我们所需要的类,这样写也是可以的,var tempClass:Class =com.flashartofwar.example.RedBox。运行一下,你同样可以看到一个和第2步相同的红色的盒子。
让我们通过XML来创建类吧,你可能会惊讶它有多么简单哦!
第四步:通过XML创建RedBox
现在我们要做与第三步同样的事情,只不过要把类的名字放到XML里。在这里例子里我要做些令人兴奋的
小变化。为什么你不用下面的代码再一次代替createRedBox呢?
- // This is some sample XML data, we can just as easily
- // loda this at runtime instead of compiling it in.
- var xmlData:XML = <boxes base-package="com.flashartofwar.example">
- <box name="box1" class="RedBox" x="10" y="10" width="100" height="100"/>
- <box name="box2" class="RedBox" x="120" y="10" width="50" height="100"/>
- <box name="box3" class="RedBox" x="190" y="10" width="20" height="100"/>
- </boxes>;
- // Pull out some core data we need from the xml
- var basePackage:String = xmlData.@["base-package"];
- var boxes:XMLList = xmlData.*;
- var box:XML;
- var boxInstance:DisplayObject;
- // Loop through each box node and build it's class
- for each(box in boxes)
- {
- // It is very important that we use quotes for the class
- // because it is a reserved word
- var tempClass : Class = getDefinitionByName(basePackage+"."+box.@["class"]) as Class;
- // Here we type box to DisplayObject since we are not
- // sure what class it actually is
- boxInstance = new tempClass();
- boxInstance.x = Number(box.@x);
- boxInstance.y = Number(box.@y);
- boxInstance.width = Number(box.@width);
- boxInstance.height = Number(box.@height);
- addChild(boxInstance);
- }
- }
确定你要导入了下面的代码哦:
- import flash.display.DisplayObject;
这回,我们有很多事情要做了,我添加了一些注释来帮助你。在上面的代码中,我们写了一些xml,并循环每一个box结点。一个好的技巧是,为了减少重复性得写代码,把package名字作为根结点的属性。下一步,你会看到每一个box都有一个名字、一个类、一个x值、一个y值,宽度和高度。最后的事情是,你应该注意我把redBox变量改成boxInstance,并且它现在的类型是DisplayObject类型的。运行下,看看发生了什么。
哦!你会看见如下的错误:
- ReferenceError: Error #1065: Variable RedBox is not defined.
- at global/flash.utils::getDefinitionByName()
- at DynamicClassDemo/createRedBox()
- at DynamicClassDemo()
在没有定义类型之前,它不再是com.flashartofwar.example.RedBox的引用,所以编译器会忽略导入它。这是在通过XML动态创建class的时候经常出的一个问题,我们不得不要使用一些技巧强制编译器包括这个类。让我们在com.flashartofwar.example包中创建一个叫做IncludeClasses 的新类:
- package com.flashartofwar.example {
- /**
- * @author jessefreeman
- */
- public class IncludeClasses {
- RedBox;
- }
- }
我知道,你一定认为这太疯狂了吧,但是这就是解决动态创建类的方法。非常简单地把类名字放进一个空类里,编译器就是加载它,即使在这个类里面没有任何的变量被定义。最后的事情是,定义一个该类的变量放到我们的文档类里。这里是代码:
- // This class forces the compiler to import your dynamic Classes
- var includeClasses:IncludeClasses;
并确定你导入了这个:
- import com.flashartofwar.example.IncludeClasses;
现在再次运行你的项目,你会看到3个盒子通过XML动态得被初始化出来。这可不简单哦,你可以自己试着创建一个类,来创建绿盒子和蓝盒子,然后把它们加入到IncludeClasses类里面,然后再在XML文件中配置一下。他们会像红盒子这样被创建出来。当我们知道包路径和类名的时候,我希望使用getDefinitionByName的这个简单的例子可以让我们更简便地创建类。请在评论里自由的发言吧,并讨论你在自己的项目中是如何使用这个技巧的呢。
发表评论
-
在Flex中用Validator检测数字、字符串、Email、电话号码等 .
2012-05-29 10:21 1146在Flex中用Validator检测数字、字符串、Email、 ... -
BulkLoader加载AVM1Movie显示的解决方法
2012-04-02 11:51 1095今天在使用BulkLoader的时候,碰到了一个棘 ... -
TweenLite中文帮助手册
2011-08-12 17:57 1187为什么要用TWEENLITE而不用ADOBE官方的TWEEN? ... -
Stardust AS3粒子引擎
2011-08-12 17:55 3230Stardust粒子引擎允许允许Flash 开发者门使用Act ... -
RED5遍历客户端及生成在线列表
2011-05-05 17:24 1195在线列表格式为:连接ID1,连接用户名1;连接ID2,连接用户 ... -
Red5开发详解
2011-05-05 17:20 11241.下载最新版本的RED5 http://osflash.or ... -
用php的socket跟flash的socket通信
2010-07-14 12:23 2827用php的socket跟flash的socket通信 ... -
as3,Dictionary,关联数组
2010-07-13 11:00 1067来自帮助文档 关联数组 关联数组有时候也称为“哈希”或“映 ... -
Flash+html--网页向FLASH传递参数
2010-07-05 09:47 2764一、先做一个需接收参数的Flash 新建一个Flash文档, ... -
FSCommand用法详解
2009-07-22 17:33 12741、FS Command介绍 ... -
as3数据的浅复制和深复制
2009-07-18 11:30 1281复制一个数组,是指生 ... -
AS使用小技巧(二)
2009-07-18 11:28 860【精确获取某行的索引值】 在 x 和 y 参 ... -
AS使用小技巧(一)
2009-07-18 11:25 960【改变输出swf的尺度,背景颜色或帧频】 ...
相关推荐
本示例将详细介绍如何利用XML布局文件动态创建CheckBox。 首先,我们了解XML布局文件的基本结构。在Android中,每个XML布局文件通常包含一个根视图(如LinearLayout、RelativeLayout或ConstraintLayout)以及嵌套在...
本文将深入探讨如何利用XML动态生成Flash,以实现更加灵活和可扩展的内容展示。 首先,XML是一种标记语言,它允许我们以结构化的方式存储和传输数据。它的主要优点是数据与显示分离,这意味着我们可以独立地修改...
在.NET框架中,我们可以利用System.Xml.Serialization命名空间中的特性(Attributes)和类来完成这一转换。 首先,我们需要定义一个类,该类的属性对应XML文档中的元素和属性。例如,如果有一个XML文档如下: ```...
在这个场景中,"动态创建XML问卷"意味着程序可以根据需求动态生成XML结构来表示问卷,而不是预先硬编码问卷的问题和选项。下面将详细探讨这个主题。 1. **XML基础知识** - **XML元素**:XML文档由一系列元素构成,...
本篇文章将深入探讨如何利用反射在C#中动态创建对象。 1. **反射基础** 反射是.NET框架提供的一种特性,通过System.Reflection命名空间中的类来实现。主要类包括Assembly(程序集)、Type(类型)、...
本文详细介绍了一种利用C#编程语言、XML数据格式以及Microsoft .NET框架来创建动态分层菜单的方法。这种菜单系统旨在模仿Windows系统的开始菜单布局,为用户提供更加直观且易于导航的Web体验。 #### XML与C#的结合 ...
通过这个"XML动态转化为ObjectDemo",开发者可以深入理解XML在Java应用程序中的作用,以及如何利用JAXB或其他工具高效地进行XML数据的处理。这在进行数据交换、配置文件读取、Web服务交互等方面具有广泛的应用。
总的来说,利用XML动态生成窗体是一种实用的编程技巧,它结合了XML的数据描述能力与编程语言的动态创建对象的能力。这使得开发者能够灵活地设计和调整用户界面,而无需每次都手动编写大量的代码。如果你在实际项目中...
标题中提到的"利用反射动态创建对象",主要涉及到以下几个知识点: 1. **Activator.CreateInstance()**:这是最常用的动态创建对象的方法,属于SystemActivator类。它接受一个Type参数,该参数表示要创建的对象的...
### 配置文件XML与XML...利用像`XmlHelper`这样的封装类,开发者可以更加高效地处理XML配置文件,实现数据的动态管理和灵活应用。在实际项目中,合理运用XML和相关的公共类,可以极大地提高软件的可配置性和维护性。
结合`HttpPostedFileBase`类,你可以接收用户上传的XML文件,然后利用`XmlDocument`进行处理和分析。 在实际应用中,为了提高性能和减少内存占用,开发者可能会选择其他XML处理类,如`XDocument`(LINQ to XML)...
本篇文章将深入探讨如何利用XML来实现通用的WEB报表打印。 首先,我们需要理解XML的基本结构。XML文档由元素构成,每个元素都有开始标签和结束标签,例如`<report>`和`</report>`。元素可以包含其他元素、文本或...
"tinyxml生成xml动态库"指的是利用TinyXML库创建一个动态链接库(DLL),这样其他程序就可以通过调用这个库来处理XML操作,而无需包含完整的TinyXML源代码。 XML(eXtensible Markup Language)是一种标记语言,常...
在“mybatis动态创建数据库表”这个主题中,我们将深入探讨如何利用MyBatis实现数据库表的动态创建、数据插入以及数据修改。 一、动态创建数据库表 MyBatis本身并不直接支持动态创建数据库表,但可以通过结合Spring...
【标题】"VS2005c#根据XML动态生成各种控件的例子"涉及的核心知识点是C#编程语言、XML数据解析以及Windows Forms应用程序中动态创建和管理控件。在这个例子中,开发者利用XML文件来定义UI元素的属性,如控件类型、...
不过,如果你在VB.NET环境中创建了XML处理的类,这些类可以通过.NET互操作性被用在使用.NET框架的Windows Phone或通用Windows平台应用中。对于Android,通常使用Java的DOM、SAX或Pull解析器来处理XML。 6. **实例...
总的来说,动态创建rdlc报表的关键在于理解报表结构、设计合适的`ReportDefinition`,以及灵活运用生成器类来实现报表的XML构造。通过这样的方式,开发者可以快速响应业务需求的变化,创建出符合要求的定制化报表,...
例如,如果从XML文件读取的数据包含多列,程序可能会动态创建多个TextBox或Label控件以显示这些数据。这通常涉及`Controls.Add()`方法,以及设置控件的相关属性如Text、Name、Size等。动态生成控件可以提高代码的...
由于菜单项是动态创建的,所以可能需要使用`toolStripMenuItem.Click`事件的委托来处理。 5. **更新MenuStrip**:最后,调用MenuStrip的`Refresh()`方法,使其显示最新的菜单结构。 通过以上步骤,我们可以实现一...
这个解决方案利用XML文件作为配置源,通过编程语言的反射机制,实现动态创建和管理窗体上的控件,从而达到灵活应对采集内容变化的目的。 首先,我们来看XML配置文件。XML(eXtensible Markup Language)是一种结构...