1.include语句
在FLEX SDK源代码中普遍存在以下语句
include
"../core/Version.as";
include指令将*.as文件中的代码导入到当前帧。该指令的语法格式如下:
include "[path]filename.as"
注意:外部的*.as文件并非全部都是类文件,有些是为了管理方便,将帧代码按照功能放置在一个一个的*.as文件中,这样便于管理。
在Version.as文件中的代码如下
-
package mx.core
-
{
-
-
public namespace mx_internal = "";
-
}
说明:这里定义了一个命名空间mx_internal。
2.mx_internal
有时候你想改变一个Flex组件的行为, 但是它藏在私有方法或者私有变量后面, 所以你不能取得它。
许多Flex framework里的组件有些方法和属性被标记为mx_internal命名空间,这样你就可以访问藏在私有方法或者私有变量后面的东东了。这东东官方说是会随时变动的,请注意使用!
例1: 用mx_internal来设置限制输入
在NumericStepper控件中,定义了一个文本框对象inputField,其代码如下
mx_internal var inputField:ITextInput;
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application xmlns:fx=""
-
xmlns:s="library://ns.adobe.com/flex/spark"
-
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
-
<fx:Script>
-
<![CDATA[
-
import mx.core.mx_internal;//注意这里
-
use namespace mx_internal;
-
-
private function setupStepper():void{
-
stepper.mx_internal::inputField.restrict = "0-9";
-
}
-
]]>
-
</fx:Script>
-
-
<mx:NumericStepper id="stepper" creationComplete=”setupStepper();”/>
-
</s:Application>
例2:获取flex3中TextArea组件中的光标的位置
获取TextArea组件中当前光标所在的位置,即相对于TextArea中左上角(0,0)坐标的位置,但是TextArea.cursorManager.currentCursorXOffset这里的offset的值始终为0。其实Flash原本的flash.text.TextField就提供这个功能,但在Flex里却没有把它暴露出来。
要使用原本Flash里就支持的这个功能很简单。mx.controls.TextArea里负责渲染的实际上是一个mx.core.UITextField,继承自mx.core.FlexTextField;后者又继承自flash.text.TextField。只要得到TextArea里的TextField就能使用它原本就支持的功能。
可是
Flex的TextArea里textField是protected的,从外部无法获取,除非继承TextArea;
源代码如下
protected var textField:IUITextField;
TextArea.getTextField()方法是在mx_internal命名空间里的,不使用这个命名空间也无法调用。
源代码如下
mx_internal function getTextField():IUITextField
{
return textField;
}
解决方法:
导入并使用mx.core.mx_internal命名空间,然后调用getTextField()方法来得到TextField。
(1)导入和使用命名空间
import mx.core.mx_internal;
use namespace mx_internal;
(2)获取当前光标index的方法就是:
public function getCaretIndex(ta : TextArea) : int {
return (ta.getTextField() as TextField).caretIndex;
}
说明:getTextField()属于mx_internal命名空间,如果不在程序前加上use namespace mx_internal;则提示无getTextField()函数。
3.namespace
包可用于组织类文件,命名空间可用于管理各个属性和方法的可见性。
public、private、protected 和 internal(默认值) 访问控制说明符可以看作内置的命名空间。如果这些预定义的访问控制说明符无法满足要求,您可以创建自己的命名空间。
命名空间就是在一些比较大的项目里面,有很多个包,但是你又不想包之间互相暴露实现细节,所以就需要命名空间来做个桥梁,把各个包里面的方法添加到一个命名空间
命名空间允许你摆脱由包强加的组织结构并且不受访问控制属性的限制。
(1)定义命名空间的格式为
namespace flash_proxy = URL
URI必须是唯一标识字符串。 如果你忽略URI,如下所示
namespace flash_proxy;
那么编译器会在URI的位置上创建一个唯一的内部标识字符串。 你对这个内部标识字符串是没有访问权限的。
(2)应用命名空间的格式为
namespace example1;
class someClass {
example1 myFunction() {}
}
myFunction() 方法属于example1命名空间,而不能通过这个类来调用。
(3)引用命名空间格式为
use namespace example1;
对象名.myFunction();
或
对象名.example1::myFunction();
例2:声明并使用命名空间
在包exam内声明一个命名空间,在这个包内和包外声明三个类,都可以进行调用。
类myInternal.as
-
package exam
-
{
-
public namespace myInternal = "";
-
-
}
类Utility.as
-
package exam.alpha
-
{
-
import exam.myInternal;
-
-
public class Utility
-
{
-
private static var _taskCounter:int = 0;
-
-
public static function someTask():void{
-
_taskCounter++;
-
}
-
-
myInternal static function get taskCounter():int {
-
return _taskCounter;
-
}
-
}
-
}
类Helper.as
-
package exam.beta
-
{
-
import exam.myInternal;
-
-
public class Helper {
-
-
private static var _timeStamp:Date;
-
-
public static function someTask():void{
-
-
_timeStamp = new Date();
-
}
-
-
myInternal static function get lastCalled():Date {
-
return _timeStamp;
-
}
-
}
-
}
类Rabit.as
-
package exam2
-
{
-
import exam.myInternal;
-
-
public class Rabit
-
{
-
private static var _taskCounter:int = 0;
-
-
public static function someTask():void{
-
_taskCounter++;
-
}
-
-
myInternal static function get taskCounter():int {
-
return _taskCounter;
-
}
-
}
-
}
NamespaceExam.mxml
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application xmlns:fx=""
-
xmlns:s="library://ns.adobe.com/flex/spark"
-
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
-
<fx:Script>
-
<![CDATA[
-
import mx.controls.Alert;
-
-
import exam.myInternal;
-
import exam.alpha.Utility;
-
import exam.beta.Helper;
-
import exam2.Rabit;
-
-
protected function button1_clickHandler(event:MouseEvent):void
-
{
-
use namespace myInternal; //如果不使用,将提醒Utility.taskCounter不存在
-
-
Utility.someTask();
-
Utility.someTask();
-
-
Alert.show("Utility.taskCounter:"+Utility.taskCounter);
-
-
Rabit.someTask();
-
Rabit.someTask();
-
Alert.show("Rabit.taskCounter:"+Rabit.taskCounter);
-
-
Helper.someTask();
-
Alert.show("Helper.lastCalled:"+Helper.lastCalled);
-
}
-
-
]]>
-
</fx:Script>
-
<s:Button x="83" y="47" label="显示" click="button1_clickHandler(event)"/>
-
-
</s:Application>
参考文献
1.mx_internal的使用. http://www.cnblogs.com/wyyLick/archive/2011/10/23/2221861.html
2.在外部类文件中编写ActionScript程序代码.
3.如何获取TextArea中的光标的位置.
4.包、类、包外类、命名空间、属性、方法.
5.包和命名空间.
6.ActionScript 3基本原理:命名空间.http://www.adobe.com/cn/devnet/actionscript/learning/as3-fundamentals/namespaces.html
阅读(3477) | 评论(0) | 转发(0) |