// 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);