(2012-01-08 旧博文搬运)[EssentialActionScript3.0中文版]无责任翻译-22章交互性(4)

[EssentialActionScript3.0中文版]无责任翻译-22章交互性(4)

  • 空间

22.3.3.1. 多位置的按键

在某些键盘上,某一个keycodes可能代表键盘上多个位置的键。比如在MicrosoftWindows 美式英文键盘,keycode 16 即代表左SHIFT也代表右SHIFT;key code 17 即代表左CTRL也代表右CTRL;key code 13 即代表主ENTER键也代表小键盘上的ENTER键。要区分这些多位置的按键,我们使用KeyboardEvent 类的实例属性keyLocation, 它的值指示了一个逻辑位置,表达了flash.ui.KeyLocation类中(LEFT, NUM_PAD, RIGHT以及STANDARD v描述的4个位置之一。下面的代码证明了这个技巧,展示了一个KeyboardEvent.KEY_DOWN 侦听器函数,它可以输出按下左/右shift键的调试信息。

private functionkeyDownListener (e:KeyboardEvent):void {

if (e.keyCode == Keyboard.SHIFT) {

if (e.keyLocation == KeyLocation.LEFT){

trace("The left Shift key waspressed");

} else if (e.keyLocation == KeyLocation.RIGHT){

trace("The right Shift key waspressed");

}

}

}

 

22.3.4. 判断组合键的按下

要判断Shift键或Control键(在Macintosh 中是Command键)与其他键的组合,我们在KeyboardEvent.KEY_DOWN的侦听器函数中使用KeyboardEvent的实例属性shiftKey和ctrlKey.比如,下面这个简单的程序可以判断Control+S组合键的按下(在Macintosh中是Command+S):

package {

import flash.display.*;

import flash.events.*;

public class CtrlSSensorextends Sprite {

public static const S_KEY:int = 83;

public function CtrlSSensor () {

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownListener);

}

private function keyDownListener (e:KeyboardEvent):void {

if (e.keyCode ==CtrlSSensor.S_KEY && e.ctrlKey == true) {

trace("Ctrl+S waspressed");

}

}

}

}

 

NOTE

在独立的或者网页浏览器嵌入版本的Flash Player中, ActionScript不支持ALT键(以及F10键)。

 

要判断除了Shift和Control键以外的任意2个或以上的组合键的按下,我们必须手动追踪每个键的当前状态。下面的代码证明了这个技术,它展示了一个当左方向键和上方向键同时按下的时候会输出调试信息的应用程序。类似的代码常常用于驾驶一个汽车或者飞船的电视游戏中。

 


package 

{

       import flash.display.*;

       import flash.events.*;

       import flash.ui.*;

       //判断↑和←的组合键

       public classUpLeftSensor extends Sprite

       {

              // 追踪↑键的状态(当按下的时候为true,否则为false)

              private varupPressed:Boolean;

              // 追踪←键的状态(当按下的时候为true,否则为false)

              private varleftPressed:Boolean;

              public functionUpLeftSensor()

              {

                     // 注册键盘事件侦听

                     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);

                     stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);

              }

              // 处理 KeyboardEvent.KEY_DOWN 事件

              privatefunction keyDownListener(e:KeyboardEvent):void

              {

                     // 对按下的是←还是↑进行标记

                     if (e.keyCode ==Keyboard.UP)

                     {

                            upPressed = true;

                     }

                     else if (e.keyCode ==Keyboard.LEFT)

                     {

                            leftPressed = true;

                     }

                     // 如果↑和←都被按下...

                     if (upPressed &&leftPressed)

                     {

                            // ...进行程序的特定动作,比如驾驶飞船往左上飞

                            trace("Up Arrow key and Left Arrow key are both pressed");

                     }

              }

              // 处理KeyboardEvent.KEY_UP 事件

              private functionkeyUpListener(e:KeyboardEvent):void

              {

                     // 对释放的是←还是↑进行标记

                     if (e.keyCode== Keyboard.UP)

                     {

                            upPressed= false;

                     }

                     else if(e.keyCode == Keyboard.LEFT)

                     {

                            leftPressed= false;

                     }

              }

       }

}


22.3.5. 鼠标事件与修饰键AS提供了检测一个键盘事件派送的时候Shift或Control是否是按下状态的简单方法,同样也提供了当鼠标事件派送的时候Shift或Control是否按下。我们在事件侦听器函数中使用MouseEvent类的实例属性shiftKey 和 ctrlKey 。比如,下面的代码在Shift按下的时候点击鼠标则输出调试信息。类似的代码常用于一个绘图程序以实现在水平竖直轴上绘制对象。

 

package {

import flash.display.*;

import flash.events.*;

public classControlClickSensor extends Sprite {

public functionControlClickSensor () {

stage.addEventListener(MouseEvent.CLICK,clickListener);

}

private functionclickListener (e:MouseEvent):void {

if (e.shiftKey) {

trace("Shift+clickdetected");

}

}

}

22.3.6. 判断与一个键关联的字符

之前我们学习了如何判断最近按下/释放的按键的key code值。要得到关联这个按下/释放的键的实际字符,我们在侦听器函数中检查KeyboardEvent类的实例属性charCode。当使用美式英文键盘的时候, charCode 指示了这个按下/释放的键的ASCII字符码。在一些情况下,同一个键的 charCode 可能有2个不同的值,这取决于Shift键是否按下。比如,在美式英文键盘中“s”=115,而“S”=83。没有ASCII值的按键,其KeyboardEvent.charCode 值为 0.

 

当使用一个非美式英文键盘。charCode 会显示该键在美式键盘位置相同的键的ASCII 字符值。比如一个日文键盘上与美式键盘”A”的相同位置的按键会输出一个形状,但是这个键的charCode仍然返回97 或者 65 ('a' 和 'A' 在ASCII的值)—而不是 12385 ( 的Unicode代码值 ).

 

要把字符码一个转换为真实的字符串,我们使用String 类的实例方法fromCharCode(). Example 22-12 证明了这个技术,通过更新KeyViewer类 (之前的Example22-11) 来显示于我们最近按下的键关联的字符.

 

Example 22-12. 检索一个被按下的键的键代码(key code)和字符代码 (character code)


鉴于KeyboardEvent 类的实例属性keyCode, charCode 不会在当IME使用时起效,并且不被作为接受文本输入的方法。要接受文本输入,我们结合使用TextEvent.TEXT_INPUT事件和TextField 对象,下一章会介绍。

 

 

22.4. 文本输入事件

 

下面情况下,Flash Player 会派送一个text-input 事件:

• 当用户向一个输入文本框添加新文本

• 当用户activates 一个 "event:"-协议超文本链接一个文本框(通过点击链接)

• 当一个文本框被用户或程序卷动

Table 22-4 列出了 Flash Player的内置文本输入事件的种类。每种事件中, "事件类型" 一栏列出了描述事件类型的正式字符串常量, "描述" 一栏描述了这个事件代表的用户操作。"目标"一栏列出了这个事件派送的目标,"默认行为" 一栏列出了Flash Player对这个事件的原生反应。"冒泡"一栏列出该事件是否支持冒泡阶段。最后, "传递给侦听器函数的数据类型"一栏列出了传递给事件处理函数的对象的数据类型。

 (2012-01-08 旧博文搬运)[EssentialActionScript3.0中文版]无责任翻译-22章交互性(4)_第1张图片

22.4.1. TextEvent.TEXT_INPUT 与 Event.CHANGE Events

TextEvent.TEXT_INPUT 和 Event.CHANGE事件让我们侦测用户的新文本输入。具体说,下面的输入文本技术会引发TextEvent.TEXT_INPUT 和Event.CHANGE事件:

• 在键盘上按下一个键

• 通过键盘快捷键或者Flash Player的内置上下文菜单(右键单击访问)粘贴一段文本

• 对着语音识别软件说话

• 使用输入法编辑器(IME)组合一段文本内容

 

TextEvent.TEXT_INPUT 事件指示用户正试图添加一个新文本到一个可输入文本框并为应用程序阻止或允许这个行为提供了时机。TextEvent.TEXT_INPUT事件提供了一个方便的渠道来访问一段准备添加到文本框但是还没加进去的文本。于此相反, Event.CHANGE事件指示用户试图添加的文本已经成功添加入文本框,并且Flash Player 作为应答已经更新了目标文本框。

 

一般为一个TextField 对象注册TextEvent.TEXT_INPUT 事件的侦听如下:

theTextField.addEventListener(TextEvent.TEXT_INPUT, textInputListener);

 

要阻止用户输入的文本显示在一个TextField, 我们使用Event 类的实例方法preventDefault():

private function textInputListener(e:TextEvent):void {

// 阻止用户输入的文本显示

e.preventDefault();

}

 

要访问用户输入的文本,我们使用TextEvent 类的实例属性text:

private function textInputListener(e:TextEvent):void {

// 调试输出用户输入的文本

trace(e.text);

}

 

TextEvent.TEXT_INPUT 事件可能被用于在一个应用程序的输入处自动格式化用户的输入 ,如

Example 22-13所示. 在这个例子中,所有的输入到一个文本框里面的文本都被转化为大写。类似的代码常常用于在线订货单的"shipping address"一节.

 

Example 22-13. 把用户输入转化为大写

 

现在我们来看看Event.CHANGE 时间。为一个TextField 对象注册Event.CHANGE 事件侦听器一般为:

theTextField.addEventListener(Event.CHANGE, changeListener);

Event.CHANGE 事件可以被用于同步2个文本框,如Example 22-14所示。这个例子展示了一段来自假想的包含了被标签的照片的面板的引用。为了简单,代码使用Event.CHANGE来保证面板的标题栏随着当前选择照片不同而更新变化。作为回顾,代码还会当用户在程序中改变焦点时使用FocusEvent.FOCUS_IN和 FocusEvent.FOCUS_OUT 事件来更新面板的标题。

 

Example 22-14. 同步2个TextField对象

 

22.4.2. Event.SCROLL 事件

Event.SCROLL 事件会在下列变化发生在TextField 对象上时调用: scrollH, scrollV,maxscrollH,or maxscrollV. 换句话说,Event.SCROLL 事件指示文本框的下列变化:

• 文本框被水平或竖直卷动(用户通过手动或者程序通过scrollH/ scrollV 属性).

• 文本框被添加了新内容导致超出了它的水平/竖直最大卷动范围

• 字体大小的变化导致文本框的水平/竖直最大卷动范围的变化

 

TextField 对象注册Event.SCROLL 侦听的一般代码为:

theTextField.addEventListener(Event.SCROLL,scrollListener);

 

一般Event.SCROLL 事件都是用于同步一个文本框的滚动条界面,如Example 22-15所示,此例中的滚动条有如下特征:

• 可以被添加到任何TextField 对象

• 可以在垂直方向用鼠标拖曳以滚动文本框

• 自动更新以符合文本字号、内容、滚动位置的变化

 

但是为了简便,这个滚动条不包括上下滚动按钮。Example 22-15 使用了我们这一章学到的很多技术并且包含一些我们没有学习的 where appropriate, cross references tosupplemental topics are provided.

 

Example 22-15. 使用 Event.SCROLL 实现滚动条


22.4.3. TextEvent.LINK 事件

TextEvent.LINK 事件被用来调用AS代码作为对一个链向TextField 的超文本的点击的响应。TextEvent.LINK 事件当用户点击一个超文本链接的时候调用,这个超链接的URL必须是以伪协议“event:”开头的。

 

NOTE

有关在AS文本框中使用超文本链接的介绍,看Chapter 27.

 

创建一个调用AS代码的超文本链接所需的一般代码如下:

theTextField.htmlText = "<ahref='event:linkContent'>linkText</a>";

 

在前面的代码中, theTextField是包含了链接的TextField 对象。当用户点击linkText, Flash Player 就执行一个注册在theTextField或者它的可视父级对象上的侦听器。每个侦听器都被传递了一个TextEvent对象,它的text属性值就是被提供的linkContent字符串。linkContent字符串 代表性地识别一个当链接被点击时候被调用的ActionScript操作。

 

要侦听一个注册在TextField 上的TextEvent.LINK 事件的一般代码为:

theTextField.addEventListener(TextEvent.LINK,linkListener);

 

TextEvent.LINK 事件侦听器的侦听器函数一般的代码为:

private function linkListener (e:TextEvent):void {

}

 

 

使用前面的一般代码作为指导,让我们创建一个超文本链接例子,当被点击的时候开始游戏。这儿是链接的代码——注意被提供的linkContent指示了这个链接调用“startGame”操作行为的名字。

var t:TextField = new TextField();

t.htmlText = "<ahref='event:startGame'>Play now!</a>";

t.autoSize = TextFieldAutoSize.LEFT;

addChild(t);

 

现在让我们尝试创建一个不但调用一个AS操作而且传递一个参数给这项操作的超文本链接。The code for the hypertext link follows.注意这一次被提供的linkContent 指示了这个操作的名字("displayMsg")以及一个参数("hello world"), 被一个任意的定界符分隔 (比如一个逗号).

 

var t:TextField = new TextField();

t.htmlText = "<ahref='event:displayMsg,hello world'>click here</a>";

t.autoSize = TextFieldAutoSize.LEFT;

addChild(t);

 

接下来,下面的代码为之前的TextField注册了linkListener() 侦听器以侦听TextEvent.LINK事件:

t.addEventListener(TextEvent.LINK, linkListener);

 

最后,下面的代码展示了linkListener() 方法, 在这方法中我们使用String类的实例方法split() 来分隔操作名("displayMsg")和参数名("hello world")

private function linkListener (e:TextEvent):void {

var linkContent:Array = e.text.split(",");

var operationName:String = linkContent[0];

var argument:String = linkContent[1];

if (operationName == "displayMsg") {

displayMsg(argument);

}

}

 

        于JavaScript中不同, 任意的 ActionScript 代码不能被包括在<A>的超文本标签中

 

Example 22-17 展示了TextEvent.LINK 事件被用于一个假设的聊天应用程序,这个程序里用户可以通过点击字符文本框中的任何用户名来请求私聊。

Example 22-17 被高度简化以便使TextEvent.LINK的使用醒目;它没有展示任何有关实际接收或发送的消息的代码.

 

Example 22-17. 使用使用TextEvent.LINK 来使得用户名可点击

你可能感兴趣的:((2012-01-08 旧博文搬运)[EssentialActionScript3.0中文版]无责任翻译-22章交互性(4))