为交互式对象添加虚拟键盘支持Flash Player 10.2 和更高版本,AIR 2.6 和更高版本(但在 iOS 上不受支持) 通常情况下,仅在点击 TextField 对象时才会打开虚拟键盘。可以配置 InteractiveObject 类的一个实例,以便在其获得焦点时打开虚拟键盘。 若要配置 InteractiveObject 实例以打开软键盘,请将其 needsSoftKeyboard 属性设置为 true。每当对象分配到 stage focus 属性时,将自动打开软键盘。此外,还可以通过调用 InteractiveObject 的 requestSoftKeyboard() 方法来开启键盘。 下面的示例演示了如何对 InteractiveObject 编程,使之作为文本输入字段。示例中的 TextInput 类设置 needsSoftKeyboard 属性,以便在需要时开启键盘。然后,该对象侦听 keyDown 事件并将键入的字符插入字段。 该示例使用 Flash 文本引擎附加和显示键入的任何文本,并处理一些重要事件。为简单起见,该示例未实现完整功能的文本字段。 package { import flash.geom.Rectangle; import flash.display.Sprite; import flash.text.engine.TextElement; import flash.text.engine.TextBlock; import flash.events.MouseEvent; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.text.engine.TextLine; import flash.text.engine.ElementFormat; import flash.events.Event; public class TextInput extends Sprite { public var text:String = " "; public var textSize:Number = 24; public var textColor:uint = 0x000000; private var _bounds:Rectangle = new Rectangle( 0, 0, 100, textSize ); private var textElement: TextElement; private var textBlock:TextBlock = new TextBlock(); public function TextInput( text:String = "" ) { this.text = text; this.scrollRect = _bounds; this.focusRect= false; //Enable keyboard support this.needsSoftKeyboard = true; this.addEventListener(MouseEvent.MOUSE_DOWN, onSelect); this.addEventListener(FocusEvent.FOCUS_IN, onFocusIn); this.addEventListener(FocusEvent.FOCUS_OUT, onFocusOut); //Setup text engine textElement = new TextElement( text, new ElementFormat( null, textSize, textColor ) ); textBlock.content = textElement; var firstLine:TextLine = textBlock.createTextLine( null, _bounds.width - 8 ); firstLine.x = 4; firstLine.y = 4 + firstLine.totalHeight; this.addChild( firstLine ); } private function onSelect( event:MouseEvent ):void { stage.focus = this; } private function onFocusIn( event:FocusEvent ):void { this.addEventListener( KeyboardEvent.KEY_DOWN, onKey ); } private function onFocusOut( event:FocusEvent ):void { this.removeEventListener( KeyboardEvent.KEY_UP, onKey ); } private function onKey( event:KeyboardEvent ):void { textElement.replaceText( textElement.text.length, textElement.text.length, String.fromCharCode( event.charCode ) ); updateText(); } public function set bounds( newBounds:Rectangle ):void { _bounds = newBounds.clone(); drawBackground(); updateText(); this.scrollRect = _bounds; //force update to focus rect, if needed if( this.stage!= null && this.focusRect && this.stage.focus == this ) this.stage.focus = this; } private function updateText():void { //clear text lines while( this.numChildren > 0 ) this.removeChildAt( 0 ); //and recreate them var textLine:TextLine = textBlock.createTextLine( null, _bounds.width - 8); while ( textLine) { textLine.x = 4; if( textLine.previousLine != null ) { textLine.y = textLine.previousLine.y + textLine.previousLine.totalHeight + 2; } else { textLine.y = 4 + textLine.totalHeight; } this.addChild(textLine); textLine = textBlock.createTextLine(textLine, _bounds.width - 8 ); } } private function drawBackground():void { //draw background and border for the field this.graphics.clear(); this.graphics.beginFill( 0xededed ); this.graphics.lineStyle( 1, 0x000000 ); this.graphics.drawRect( _bounds.x + 2, _bounds.y + 2, _bounds.width - 4, _bounds.height - 4); this.graphics.endFill(); } } } 下面的主应用程序类演示了当键盘开启或设备方向更改时如何使用 TextInput 类和管理应用程序布局。主类创建一个 TextInput 对象并设置其边界以填充舞台。当软键盘开启或舞台大小更改时,该类调整 TextInput 对象的大小。该类侦听 TextInput 对象的 soft keyboard 事件以及舞台的 resize 事件。无论事件的原因如何,应用程序都会确定舞台的可见区域,并调整输入控件的大小以填充该区域。当然,在实际应用程序中,需要更复杂的布局算法。 package { import flash.display.MovieClip; import flash.events.SoftKeyboardEvent; import flash.geom.Rectangle; import flash.events.Event; import flash.display.StageScaleMode; import flash.display.StageAlign; public class CustomTextField extends MovieClip { private var customField:TextInput = new TextInput("Input text: "); public function CustomTextField() { this.stage.scaleMode = StageScaleMode.NO_SCALE; this.stage.align = StageAlign.TOP_LEFT; this.addChild( customField ); customField.bounds = new Rectangle( 0, 0, this.stage.stageWidth, this.stage.stageHeight ); //track soft keyboard and stage resize events customField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, onDisplayAreaChange ); customField.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, onDisplayAreaChange ); this.stage.addEventListener( Event.RESIZE, onDisplayAreaChange ); } private function onDisplayAreaChange( event:Event ):void { //Fill the stage if possible, but avoid the area covered by a keyboard var desiredBounds = new Rectangle( 0, 0, this.stage.stageWidth, this.stage.stageHeight ); if( this.stage.stageHeight - this.stage.softKeyboardRect.height < desiredBounds.height ) desiredBounds.height = this.stage.stageHeight - this.stage.softKeyboardRect.height; customField.bounds = desiredBounds; } } } 注: 当 scaleMode 属性设置为 noScale 时,舞台仅调度 resize 事件以响应方向更改。在其他模式中,舞台尺寸不发生更改;而是通过缩放内容来补偿方向更改。
|
|