您当前的位置: 首页 >  容器

Jave.Lin

暂无认证

  • 4浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

AS3 Panel ---- 容器框类 扩展、优化了其它的子控件

Jave.Lin 发布时间:2012-04-11 13:34:32 ,浏览量:4

在做这个Panel控件的时候,发现,滚动条控件还有功能还是可以优化及修复的。

Panel类:

package
{
	import controlsEvents.ScrollerEvent;
	
	import flash.display.DisplayObject;
	import flash.display.Shape;

	/**
	 * 容器框类
	 * @author Jave.Lin
	 */
	public class Panel extends Control
	{
		private var _isDrawBorder:Boolean=true;
		private var _isDrawBackground:Boolean=true;
		private var _containerMask:Shape;//容器遮罩
		private var _container:Control;//容器
		private var _isUseHs:Boolean=false;//是否使用水平滚动条
		private var _isUseVs:Boolean=false;//是否使用垂直滚动条
		
		private var _sW:Number=0;//显示区域的宽
		private var _sH:Number=0;//显示区域的高
		
		private var _hs:HorizontalScroller;
		private var _vs:VerticalScroller;
		//是否使用垂直滚动条
		public function get isUseVs():Boolean
		{
			return _isUseVs;
		}
		
		public function set isUseVs(value:Boolean):void
		{
			if(_isUseVs!=value)
			{
				_isUseVs=value;
				if(_isUseVs)super.addChild(_vs);
				else super.removeChild(_vs);
				
				onLayout();
				refreshBackground();
				updateScroller();
			}
		}
		//是否使用水平滚动条
		public function get isUseHs():Boolean
		{
			return _isUseHs;
		}
		
		public function set isUseHs(value:Boolean):void
		{
			if(_isUseHs!=value)
			{
				_isUseHs=value;
				if(_isUseHs)super.addChild(_hs);
				else super.removeChild(_hs);
				
				onLayout();
				refreshBackground();
				updateScroller();
			}
		}
		
		//是否绘制边框
		public function get isDrawBorder():Boolean
		{
			return _isDrawBorder;
		}
		
		public function set isDrawBorder(value:Boolean):void
		{
			if(_isDrawBorder!=value)
			{
				_isDrawBorder=value;
				
				refreshBackground();
			}
		}
		//是否绘制背景
		public function get isDrawBackground():Boolean
		{
			return _isDrawBackground;
		}
		
		public function set isDrawBackground(value:Boolean):void
		{
			if(_isDrawBackground!=value)
			{
				_isDrawBackground=value;
				
				refreshBackground();
			}
		}
				
		public override function get width():Number
		{
			return super.width;
		}
		
		public override function set width(value:Number):void
		{
			if(width!=value)
			{
				_w=value;
				
				onLayout();
				refreshBackground();
				updateScroller();
			}
		}
		
		public override function get height():Number
		{
			return super.height;
		}
		
		public override function set height(value:Number):void
		{
			if(_h!=value)
			{
				_h=value;
				
				onLayout();
				refreshBackground();
				updateScroller();
			}
		}
		
		public function Panel()
		{
			super();
		}
		
		public override function addChild(child:DisplayObject):DisplayObject
		{
			return _container.addChild(child);
		}
		
		public override function removeChild(child:DisplayObject):DisplayObject
		{
			return _container.removeChild(child);
		}
		
		public function draw0($isDrawBorder:Boolean,$isDrawBackground:Boolean):void
		{
			_isDrawBorder=$isDrawBorder;
			_isDrawBackground=$isDrawBackground;
			
			refreshBackground();
		}
		
		public function draw1($width:Number,$height:Number):void
		{
			_w=$width;
			_h=$height;
			
			onLayout();
			refreshBackground();
			updateScroller();
		}
		
		public function draw2($isDrawBorder:Boolean,$isDrawBackground:Boolean,$width:Number,$height:Number):void
		{
			_isDrawBorder=$isDrawBorder;
			_isDrawBackground=$isDrawBackground;
			_w=$width;
			_h=$height;
			
			onLayout();
			refreshBackground();
			updateScroller();
		}
		
		public function refreshScroller():void
		{
			updateScroller();
		}
		
		private function updateScroller():void
		{
			if(!_isUseVs)
			{
				_vs.curVisibleRate=1;
			}
			else
			{
				//值范围
				if(_sH>_container.height)
				{
					_vs.maxValue=_sH;
				}
				else
				{
					_vs.maxValue=_container.height-_sH;
				}
				//显示比率
				_vs.curVisibleRate=1-(_sH/_container.height);
			}
			if(!_isUseHs)
			{
				_hs.curVisibleRate=1;
			}
			else
			{
				//值范围
				if(_sW>_container.width)
				{
					_hs.maxValue=_sW;
				}
				else
				{
					_hs.maxValue=_container.width-_sW;
				}
				_hs.curVisibleRate=1-(_sW/_container.width);
			}
		}
		
		private function onLayout():void
		{
			//计算显示区域大小
			if(_isUseVs)_sW=width-_vs.width;
			else _sW=width;
			if(_isUseHs)_sH=height-_hs.height;
			else _sH=height;
			
			//设置滚动条位置
			if(_isUseVs)
			{
				_vs.x=_sW;
				_vs.height=_sH;
			}
			if(_isUseHs)
			{
				_hs.y=_sH;
				_hs.width=_sW;
			}			
		}
		
		protected override function initialize():void
		{
			_w=100;
			_h=100;
			
			_container=new Control();
			super.addChild(_container);
			
			_containerMask=new Shape();
			super.addChild(_containerMask);
			
			_container.mask=_containerMask;
			
			_vs=new VerticalScroller();
			_hs=new HorizontalScroller();
			
			_vs.addEventListener(ScrollerEvent.VALUE_CHANGED,onVsValueChangedHandler);
			_hs.addEventListener(ScrollerEvent.VALUE_CHANGED,onHsValueChangedHandler);
			
			onLayout();
			updateScroller();
		}
		
		private function onHsValueChangedHandler(e:ScrollerEvent):void
		{
			_container.x=-e.value;
		}
		
		private function onVsValueChangedHandler(e:ScrollerEvent):void
		{
			_container.y=-e.value;
		}
		
		protected override function refreshBackground():void
		{
			_containerMask.graphics.clear();
			_containerMask.graphics.beginFill(0);
			_containerMask.graphics.drawRect(0,0,_sW,_sH);
			_containerMask.graphics.endFill();
			
			this.graphics.clear();
			if(_isDrawBackground)
			{
				this.graphics.beginFill(0x00ff00,.1);
				this.graphics.drawRect(0,0,width,height);
				this.graphics.endFill();
			}
			if(_isDrawBorder)
			{
				this.graphics.lineStyle(1,0,.5);
				this.graphics.moveTo(0,0);
				this.graphics.lineTo(width,0);
				this.graphics.lineTo(width,height);
				this.graphics.lineTo(0,height);
				this.graphics.lineTo(0,0);
			}
		}
	}
}
测试类:

package test
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	public class PanelTest extends Sprite
	{
		private var p:Panel;
		
		public function PanelTest()
		{
			super();
			
			stage.color=0xccccbb;
			stage.frameRate=60;
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			
			p=new Panel();
			addChild(p);
			p.width=300;
			p.isDrawBackground=false;
			p.x=100;
			p.y=100;
			
			var textbox:TextBox=new TextBox("testasdfasdfasdfasfd",0,0,500,500);
			p.addChild(textbox);
			
			textbox.isWordWrap=true;
			textbox.height=500;
			textbox.x=50;
			textbox.y=60;
			
			var bt:Button=new Button("button");
			p.addChild(bt);
			p.isUseHs=true;
			p.isUseVs=true;
			bt.x=50;
			bt.y=10;
			
			bt.addEventListener(MouseEvent.CLICK,onClick);
		}
		
		private function onClick(e:MouseEvent):void
		{
			if(!p.hasEventListener(Event.ENTER_FRAME))
			{
				p.addEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
			else
			{
				p.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
		}
		
		private var dW:Number=10;
		private var dH:Number=10;
		
		private function onEnterFrame(e:Event):void
		{
			if(p.width200)
			{
				dW=-10;
			}
			
			if(p.height200)
			{
				dH=-10;
			}
			
			p.draw1(p.width+dW,p.height+dH);
		}
	}
}
运行图片效果:

关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0790s