Virtueel toetsenbord ondersteunen voor interactieve objecten

Flash Player 10.2 en hoger, AIR 2.6 en hoger (maar niet ondersteund op iOS)

Normaliter wordt het virtuele toetsenbord alleen weergegeven wanneer een TextField-object wordt aangeraakt. U kunt een instantie van de InteractiveObject-klasse configureren, zodat het virtuele toetsenbord wordt geopend als het object de focus krijgt.

Stel de eigenschap needsSoftKeyboard van een InteractiveObject-instantie in op true om de instantie zodanig te configureren dat het elektronische toetsenbord wordt geopend. Wanneer het object wordt toegewezen aan de focuseigenschap van het werkgebied, wordt het elektronische toetsenbord automatisch geopend. Bovendien kunt u het toetsenbord weergeven door de methode requestSoftKeyboard() van het InteractiveObject aan te roepen.

Het volgende voorbeeld toont hoe u een InteractiveObject zodanig kunt programmeren dat het als een veld voor tekstinvoer fungeert. De klasse TextInput uit het voorbeeld stelt de eigenschap needsSoftKeyboard zodanig in dat het toetsenbord wordt weergegeven wanneer dat nodig is. Het object luistert vervolgens naar keyDown -gebeurtenissen en voegt het getypte teken in in het veld.

Het voorbeeld maakt gebruik van de Flash-tekstengine om getypte tekst toe te voegen en weer te geven en verwerkt enkele belangrijke gebeurtenissen. Om het eenvoudig te houden, implementeert het voorbeeld geen tekstveld met alle mogelijke functies.

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(); 
        } 
    } 
}

De volgende hoofdtoepassingsklasse toont hoe u de klasse TextInput kunt gebruiken en de toepassingslay-out kunt beheren wanneer het toetsenbord wordt weergegeven of de oriëntatie van het apparaat wordt gewijzigd. De hoofdklasse creëert een TextInput-object en stelt de grenzen van het object in om het werkgebied te vullen. De klasse past de grootte van het TextInput-object aan wanneer het virtuele toetsenbord verschijnt of wanneer de grootte van het werkgebied verandert. De klasse luistert naar elektronische-toetsenbordgebeurtenissen van het TextInput-object en naar vergroot- of verkleingebeurtenissen van het werkgebied. Ongeacht de oorzaak van de gebeurtenis bepaalt de toepassing het zichtbare gedeelte van het werkgebied en past het de grootte van het tekstinvoergebied aan het werkgebied aan. In een echte toepassing hebt u natuurlijk een meer geavanceerd lay-outalgoritme nodig.

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; 
        } 
    } 
}
Opmerking: Het werkgebied verzendt alleen vergroot- of verkleingebeurtenissen als reactie op een wijziging van de oriëntatie wanneer de eigenschap scaleMode is ingesteld op noScale . In andere modi blijven de afmetingen van het werkgebied ongewijzigd en wordt de inhoud ter compensatie geschaald.