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