写步进器的时候,一般要求TextField也能支持输入,而且是大于等于0的有意义的数字 , 比如 "01"就是不行的.在这里需要介绍一点知识 , (本着不知道知道,知道理解的宗旨)

    事件 :

                TextEvent.TEXT_INPUT

                Event.CHANGE

                首先 , TextEvent.TEXT_INPUT : 有文字将要输入 , 而且是一个一个的输入(待会解释)

                          Event.CHANGE : 文本输入后触发

                

                对于 : TextField , 有一个只读的属性 : careIndex , 其意义是 : 光标插入点位置的索引

 

好了 , 上一个步进器的是实现:

package com.niuniu.module.room.view.item
{
	import com.game.common.Config;
	import com.game.common.GameUtil;
	import com.game.common.StageInfo;
	import com.game.moduleBase.view.BaseView;
	import com.game.moduleCall.ModuleCallManger;
	import com.game.ui.layer.LayerManager;
	import com.game.ui.layer.LayerType;
	import com.game.ui.reslib.ResLib;
	import com.niuniu.GameEventTypeStr;
	import com.niuniu.common.UserManager;
	
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TextEvent;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	
	import tw.ui.AlertDialog;

	/**
	 * 带入筹码Panel
	 * @author Kayer
	 * */
	public final class BuyChipsPanel extends BaseView
	{
		private var $btnClose : SimpleButton;
		private var $btnMinus : SimpleButton;
		private var $btnPlus : SimpleButton;
		private var $btnSure : SimpleButton;
		private var $labValue : TextField;
		
		private var $bgMask:Sprite;//背景遮罩
		private var $isMask:Boolean;
		
		private var $stepOff : uint = 1;
		/**本次最多能购买的筹码数*/
		private var $maxBuyingChips : uint = 0;
		/**文本*/
		private var $text : String;
		/**
		 * @param $isMask : 是否是模态
		 * */
		public function BuyChipsPanel( $isMask : Boolean = true )
		{
			this.$isMask = $isMask;
			this.$stepOff = Config.exchangeStep
			this.$maxBuyingChips = Config.maxChipsBuyWhthMoBean( UserManager.instance.mySelfMoBean );
			super();
		}
		override protected function initDis():void
		{
			if( this.$isMask )
			{
				this.$bgMask = new Sprite();
				LayerManager.instance.getLayer(LayerType.LAYER_POPUP_DIALOG).addChild(this.$bgMask);
			}
			this._mc = ResLib.getMovieClip('com.niuniu.module.room.BuyChips');//com.niuniu.module.room.ROOM_VIEW
			this.addChild( this.mc );
			this.$btnClose = this.mc["btnClose"];
			this.$btnMinus = this.mc["btnMinus"];
			this.$btnPlus = this.mc["btnPlus"];
			this.$btnSure = this.mc["btnSure"];//btnSure
			this.$labValue = this.mc["labValue"];
			this.$labValue.type = TextFieldType.INPUT;
//			this.$labValue.mouseEnabled = false;
			this.$labValue.text = "0";
			super.makeEnabled( true );
		}
		override public function onStageResizeListener(e:Event):void
		{
			if( this.$isMask )
			{
				if ( this.$bgMask != null ) {
					this.$bgMask.graphics.clear();
					this.$bgMask.graphics.beginFill( 0x000000 , 0.2 );
					this.$bgMask.graphics.drawRect(0,0,StageInfo.STAGE.stageWidth,StageInfo.STAGE.stageHeight);
					this.$bgMask.graphics.endFill();
				}
			}
			this.setXY( (StageInfo.WIDTH - this.width ) >>1 , ( StageInfo.HEIGHT - this.height ) >>1 );
		}
		override protected function initEvent():void
		{
			this.$btnClose.addEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnMinus.addEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnPlus.addEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnSure.addEventListener( MouseEvent.CLICK , onClickHandler );
			this.$labValue.addEventListener( TextEvent.TEXT_INPUT , onChipsNumChange );
			this.$labValue.addEventListener( Event.CHANGE , onChipsNumChangeA );
			StageInfo.STAGE.addEventListener(Event.RESIZE, onStageResizeListener);
		}
		override protected function removeEvent():void
		{
			this.$btnClose.removeEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnMinus.removeEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnPlus.removeEventListener( MouseEvent.CLICK , onClickHandler );
			this.$btnSure.removeEventListener( MouseEvent.CLICK , onClickHandler );
			this.$labValue.removeEventListener( TextEvent.TEXT_INPUT , onChipsNumChange );
			this.$labValue.removeEventListener( Event.CHANGE , onChipsNumChangeA );
			StageInfo.STAGE.addEventListener(Event.RESIZE, onStageResizeListener);
		}
		private function onClickHandler( $e : MouseEvent ) : void
		{
			switch( $e.target.name )
			{
				case "btnClose":
					if( UserManager.instance.getSelf().score > 0 )
						this.destroy();
					else
						AlertDialog.createWarnWin( "" , "您的筹码不足,请先购买筹码!", 0 , AlertDialog.VIEWOK , function( $e :  String ) : void{  } , true );
					break;
				case "btnMinus":
//					trace("btnMinus");
					this.stepHandlder( - this.$stepOff );
					break;
				case "btnPlus":
//					trace("btnPlus");
					this.stepHandlder( this.$stepOff );
					break;
				case "btnSure":
//					trace("btnSure");
					this.onSure();
					break;
			}
		}
		private function onChipsNumChange( $e : TextEvent ) : void
		{
			if(  this.$labValue.text.substr(0,1) == "0" && ($e.currentTarget as TextField).caretIndex > 0 )
			{
				if( !isNaN( Number($e.text)  ) )
					this.$text = $e.text;
				else
					this.$text = this.$labValue.text;
			}
			else
			{
				if( isNaN( Number($e.text)  ) )
					this.$text = this.$labValue.text;
				else if( int( $e.text ) == 0 ) 
				{
					if( ($e.currentTarget as TextField).caretIndex == 0 )
						this.$text = this.$labValue.text;
					else
						this.$text = "";
				}
				else
					this.$text = "";
			}
		}
		private function onChipsNumChangeA( $e : Event ) : void
		{
			if( this.$text != "" )
				this.$labValue.text = this.$text;
			else
			{
				var buffer : Number = Number( this.$labValue.text );
				if( buffer > this.$maxBuyingChips )
					this.$labValue.text = this.$maxBuyingChips.toString();
			}
		}
		/**
		 * 显示
		 * */
		public function show() : void
		{
			onStageResizeListener(null);
			LayerManager.instance.getLayer(LayerType.LAYER_POPUP_DIALOG).addChild(this);
		}
		/**
		 * 处理兑换
		 * */
		private function onSure() : void
		{
			if( uint( GameUtil.trim(this.$labValue.text ) ) <= 0 )
			{
				AlertDialog.createWarnWin( "" , "请重新设置兑换数额!", 0 , AlertDialog.VIEWOK , function( $e :  String ) : void{  } , true );
			}
			else
			{
				//请求兑换筹码
				ModuleCallManger.disE( GameEventTypeStr.NOTYFY_MAGICBEAN_2_CHIPS_REQ , uint( GameUtil.trim(this.$labValue.text ) ) );
				this.destroy();
			}
		}
		/**
		 * 实现步进器算法
		 * @param $off : (+- 步进器步长)
		 * */
		private function stepHandlder( $off : int ) : void
		{
			var buffer : Number = Number( this.$labValue.text ) + $off;
			if( buffer >= 0 )
			{
				if( buffer <= this.$maxBuyingChips )
					this.$labValue.text = buffer.toString();
				else
				{
					this.$labValue.text == this.$maxBuyingChips.toString();
					if( this.$maxBuyingChips == 0 )
					{
						AlertDialog.createWarnWin( "" , "魔豆不足,请充值!", 0, AlertDialog.VIEWOK  ,null );
					}
				}
			}
		}
		override protected function removeDis():void
		{
			if( this.$isMask )
			{
				if( this.$bgMask != null )
				{
					LayerManager.instance.getLayer(LayerType.LAYER_POPUP_DIALOG).removeChild(this.$bgMask);
					this.$bgMask = null;
				}
			}
		}
		override public function destroy():void
		{
			super.destroy();
		}
	}
}

 

        现在需要解释 :       TextEvent.TEXT_INPUT   , 一个一个的输入"woshi"时

AS3步进器_步进器

第一次获取 : "w" , 第二次获取 "o" , 由于TextEvent.TEXT_INPUT : 有文字将要输入 ( target(TextField)的值没变,光标没变 ) ,所以 , careIndex 一直是1(在默认值"0"的后面输入)

 


AS3步进器_步进器_02

AS3步进器_步进器_03