比例尺

// ActionScript file
package {
	import flash.display.Graphics;
	
	import mx.controls.Label;
	import mx.core.UIComponent;
	import mx.core.UITextField;
	
	[Style(name="shadowColor", type="uint", format="Color", inherit="yes")]
	[Style(name="strokeColor", type="uint", format="Color", inherit="yes")]
	[Style(name="strokeWidth", type="Number", format="Number", inherit="yes")]
	[Style(name="strokeHeight", type="Number", format="Number", inherit="yes")]
	[Style(name="sectNum", type="Number", format="Number", inherit="yes")]
	
	/**
	 * @author pWX151802
	 */
	public class ScaleRule extends UIComponent
	{
		
		/**
		 *  @private
		 */
		private static const DEFAULT_PREFERRED_WIDTH:Number = 100;
		
		private static const OFFSET:Number = 20;
		
		public function ScaleRule()
		{
			super();
		}
		
		override protected function createChildren():void{
			super.createChildren();
			labelObjects = new UIComponent();
			addChild(labelObjects);
		}
		
		override protected function commitProperties():void{
			super.commitProperties();
			if (labelsChanged)
			{
				labelsChanged = false;
				
				createLabels();
			}
		}
		
		/**
		 *  @private
		 */
		override protected function measure():void
		{
			super.measure();
			
			measuredWidth = DEFAULT_PREFERRED_WIDTH;
			measuredHeight = getStyle("strokeHeight");
		}
		
		override protected function updateDisplayList(unscaledWidth:Number,
													  unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth, unscaledHeight);
			
			var g:Graphics = graphics;
			
			g.clear();
			
			var strokeColor:Number = getStyle("strokeColor");
			var shadowColor:Number = getStyle("shadowColor");
			var strokeWidth:Number = getStyle("strokeWidth");
			var strokeHight:Number = getStyle("strokeHeight");
			var sectNum:Number = getStyle("sectNum");
			
			if (strokeHight > unscaledHeight)
				strokeHight = unscaledHeight;
			
			var left:Number = 0;
			var top:Number = _labels?unscaledHeight / 2:(unscaledHeight - strokeHight)/ 2;
			var right:Number = _labels?unscaledWidth - OFFSET:unscaledWidth;
			
			var pieceWidth:Number = Math.min(right/sectNum,strokeWidth<5?right:strokeWidth);
			
			var bottom:Number = top + strokeHight;
			
			if (sectNum == 1)
			{
				g.beginFill(strokeColor);
				g.drawRect(left, top, pieceWidth, strokeHight);
				g.endFill();
			}
			else if (sectNum > 1)
			{
				var leftPoint:Number = left;
				
				for(var i:int=0;i<sectNum;i++){
					if(i%2 == 0){
						g.beginFill(strokeColor);
						g.drawRect(leftPoint, top, pieceWidth, strokeHight);
					}else{
						g.beginFill(shadowColor);
						g.drawRect(leftPoint, top, pieceWidth, strokeHight);
					}
					leftPoint = leftPoint + pieceWidth;
				}
				g.endFill();
				
			}
			
			layoutLabels(pieceWidth,unscaledHeight / 2);
			
		}
		
		private var labelObjects:UIComponent;
		
		/**
		 *  @private
		 */
		private function createLabels():void
		{
			
			if (labelObjects)
			{
				for (var i:int = labelObjects.numChildren - 1; i >= 0; i--)
				{
					labelObjects.removeChildAt(i);
				}
			}
			
			if (_labels)
			{
				var numLabels:int = _labels.length;
				
				for (var j:int = 0; j < numLabels; j++)
				{
					var labelObj:Label = new Label();
					
					labelObj.setStyle("fontSize",10);
					
					labelObj.text = _labels[j] is String ?
						_labels[j]+_unitage :
						_labels[j].toString()+_unitage;
					labelObj.y = 0;
					labelObjects.addChild(labelObj);
				}
			}
		}
		
		/**
		 *  @private
		 */
		private function layoutLabels(pieceWidth:Number, labelHeight:Number):void
		{
			var numLabels:Number = labelObjects ? labelObjects.numChildren : 0;
			
			if (numLabels > 0)
			{
				var labelInterval:Number = pieceWidth;
				
				var labelPos:Number;
				var left:Number = labelInterval;
				var curLabel:Object;
				
				for (var i:int = 0; i < numLabels; i++)
				{
					curLabel = labelObjects.getChildAt(i);
					curLabel.setActualSize(curLabel.getExplicitOrMeasuredWidth(), curLabel.getExplicitOrMeasuredHeight());
					
					labelPos = curLabel.getExplicitOrMeasuredWidth() / 2;
					
					curLabel.move(left-5,0);
					
					left += labelInterval;
				}
			}
		}
		
		private var _unitage:String = "";
		
		private var labelsChanged:Boolean =false;
		
		public function set unitage(value:String):void{
			_unitage = value;
		}
		
		private var _labels:Array;
		
		public function set labels(value:Array):void{
			labelsChanged = true;
			_labels = value;
		}
		
	}	
}

引用:
var scaleRule:ScaleRule = new ScaleRule;
				scaleRule.percentWidth = 100;
				scaleRule.height = 30;
				scaleRule.setStyle("strokeColor",0x000000);
				scaleRule.setStyle("shadowColor",0xaaaaaa);
				scaleRule.setStyle("strokeHeight",5);
				scaleRule.setStyle("strokeWidth",50);
				scaleRule.setStyle("sectNum",4);
				scaleRule.labels=['1','2','3','4'];
				scaleRule.unitage = "m";
				this.addChild(scaleRule);

猜你喜欢

转载自pczhuce-126-com.iteye.com/blog/1766633