Normalt öppnas det virtuella tangentbordet bara när någon pekar på ett TextField-objekt. Du kan konfigurera en instans av klassen InteractiveObject för att öppna det virtuella tangentbordet när det får fokus.
Om du vill konfigurera en InteractiveObject-instans så att den öppnar det virtuella tangentbordet anger du dess
needsSoftKeyboard
-egenskap som
true
. Så snart objektet tilldelas scenens focus-egenskap öppnas det virtuella tangentbordet automatiskt. Du kan dessutom öppna tangentbordet genom att anropa metoden
requestSoftKeyboard()
för InteractiveObject.
Följande exempel visar hur du kan programmera ett InteractiveObject-objekt så att det fungerar som ett fält för textinmatning. Den TextInput-klass som visas i exemplet anger egenskapen
needsSoftKeyboard
så att tangentbordet öppnas när det behövs. Objektet lyssnar efter
keyDown
-händelser och infogar det tecken som skrivs i fältet.
I exemplet används textmotorn i Flash för att lägga till och visa text som skrivs och för att hantera vissa viktiga händelser. För enkelhets skull implementeras inte alla funktioner för textfältet i exemplet.
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();
}
}
}
Följande huvudprogramklass visar hur du använder klassen TextInput och hanterar programlayouten när tangentbordet öppnas eller enhetens orientering ändras. Huvudklassen skapar ett TextInput-objekt och anger dess gränser så att det fyller scenen. Klassen justerar storleken på TextInput-objektet antingen när det virtuella tangentbordet öppnas eller när scenens storlek ändras. Klassen lyssnar efter tangentbordshändelser från TextInput-objektet och storleksändringshändelser från scenen. Oavsett orsaken till händelsen fastställer programmet scenens synliga område och ändrar inmatningskontrollen för att fylla det. I ett riktigt program behöver du naturligtvis en mer sofistikerad layoutalgoritm.
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;
}
}
}
Obs!
Scenen skickar bara storleksändringshändelser som svar på en orienteringsändring när egenskapen
scaleMode
är inställd på
noScale
. I andra lägen ändras inte scenens dimensioner, utan i stället skalas innehållet för att passa.