Flex ColumnChart verticalAxis 中的title在变换皮肤时的异常

本文介绍了解决ColumnChart中标题在更新皮肤时位置偏移的问题。通过自定义ChartTitleRenderer,调整了垂直轴标题的渲染方式,确保了标题位置的正确性。
  在ColumnChart 中添加了title的显示,但在更新皮肤时,发现title 的位置会向左下方移动(仅在verticalAxisTitleAlignment="vertical"时)。 AxisRenderer 中的verticalAxisTitleAlignment有两值可供先用:flippedVertical 将title从上往下渲染; vertical 将title从下往上渲染。 部分代码如下: width="100%" height="100%" dataProvider="{dataSet}" > Solution: 调式跟踪发现在ChartLabel 这个类中的updateDisplayList()方法中 if (parent && parent is AxisRenderer && parent.rotation == 90 && _label.embedFonts == true) { var p:AxisRenderer = AxisRenderer(parent); if ((p.getStyle('verticalAxisTitleAlignment') == 'vertical' && p.layoutDirection == LayoutDirection.LTR) || (p.getStyle('verticalAxisTitleAlignment') == 'flippedVertical' && p.layoutDirection == LayoutDirection.RTL)) { _label.rotation = 180; _label.y = _label.y + _label.height; _label.x = _label.x + _label.width; } } 注:因为项目中用到了嵌入字体,所以label.embedFonts = true。
  title会旋转180度,然后将x,y坐标相应的增加width和height。这样以来,每次调到该方法,title就会向左下方
  移动了。
  本想扩展ChartLabel时,发现该类中都是私有属性。只好使用titleRenderer来处理了。 ChartTitleRenderer.as 如下: package com.onestart.example.controls { import flash.display.*; import flash.geom.*; import mx.charts.AxisLabel; import mx.charts.AxisRenderer; import mx.core.FlexBitmap; import mx.core.IDataRenderer; import mx.core.IUITextField; import mx.core.LayoutDirection; import mx.core.UIComponent; import mx.core.UITextField; import mx.core.mx_internal; use namespace mx_internal; /** * Draws data labels on chart controls. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class ChartTitleRenderer extends UIComponent implements IDataRenderer { //------------------------------------------------ -------------------------- // // Class constants // //------------------------------------------------ -------------------------- /** * @private */ private static var ORIGIN:Point = new Point(0, 0); /** * @private */ private static var X_UNIT:Point = new Point(1, 0); //------------------------------------------------ -------------------------- // // Constructor // //------------------------------------------------ -------------------------- /** * Constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function ChartTitleRenderer() { super(); this.includeInLayout = false; this.layoutDirection = LayoutDirection.LTR; } //------------------------------------------------ -------------------------- // // Variables // //------------------------------------------------ -------------------------- /** * @private */ private var _label:IUITextField; /** * @private */ private var _bitmap:Bitmap; /** * @private */ private var _capturedText:BitmapData; /** * @private */ private var _text:String; //------------------------------------------------ -------------------------- // // Properties // //------------------------------------------------ -------------------------- //---------------------------------- // data //---------------------------------- /** * @private */ private var _data:Object; [Inspectable(environment="none")] /** * Defines the contents of the label. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get data():Object { return _data; } /** * @private */ public function set data(value:Object):void { if (value == _data) return; _data = value; if (value is AxisLabel) _text = AxisLabel(value).text; else if (value is String) _text = String(value); _label.text = _text == null ? "":_text; invalidateSize(); invalidateDisplayList(); } //------------------------------------------------ -------------------------- // // Overridden methods: UIComponent // //------------------------------------------------ -------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function invalidateSize():void { super.invalidateSize(); } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function createChildren():void { super.createChildren(); _label = IUITextField(createInFontContext(UITextField)); _label.multiline = true; _label.selectable = false; _label.autoSize = "left"; _label.styleName = this; addChild(DisplayObject(_label)); } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function measure():void { var oldRotation:Number = rotation; if (parent && parent.rotation == 90) rotation = -90; _label.validateNow(); if (_label.embedFonts) { measuredWidth = _label.measuredWidth + 6; measuredHeight = _label.measuredHeight + UITextField.TEXT_HEIGHT_PADDING; } else { measuredWidth = _label.textWidth + 6; measuredHeight = _label.textHeight + UITextField.TEXT_HEIGHT_PADDING; } rotation = oldRotation; } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { if (parent && parent is AxisRenderer && parent.rotation == 90 && _label.embedFonts == true) { var p:AxisRenderer = AxisRenderer(parent); if ((p.getStyle('verticalAxisTitleAlignment') == 'vertical' && p.layoutDirection == LayoutDirection.LTR) || (p.getStyle('verticalAxisTitleAlignment') == 'flippedVertical' && p.layoutDirection == LayoutDirection.RTL)) { _label.rotation = 180; _label.y = _label.height ; _label.x = _label.width; } } _label.validateNow(); _label.setActualSize(unscaledWidth, unscaledHeight); var localX:Point; var localO:Point; var useLabel:Boolean = true; if (_label.embedFonts == false && unscaledWidth > 0 && unscaledHeight > 0) { localX = globalToLocal(X_UNIT); localO = globalToLocal(ORIGIN); useLabel = localX.x - localO.x == 1 && localX.y - localO.y == 0; } if (useLabel) { if (_bitmap) { removeChild(_bitmap); _bitmap = null; } _label.visible = true; } else { _label.visible = false; if (!_capturedText || _capturedText.width != unscaledWidth || _capturedText.height != unscaledHeight) { _capturedText = new BitmapData(unscaledWidth, unscaledHeight); if (_bitmap) { removeChild(_bitmap); _bitmap = null; } } if (!_bitmap) { _bitmap = new FlexBitmap(_capturedText); _bitmap.smoothing = true; addChild(_bitmap); } _capturedText.fillRect( new Rectangle(0, 0, unscaledWidth, unscaledHeight), 0); _capturedText.draw(_label); if (parent && parent.rotation == 90 && parent is AxisRenderer) { p = AxisRenderer(parent); if((p.getStyle('verticalAxisTitleAlignment')=="ver tical" && p.layoutDirection == LayoutDirection.LTR) || (p.getStyle('verticalAxisTitleAlignment') == 'flippedVertical' && p.layoutDirection == LayoutDirection.RTL)) { _bitmap.rotation = 180; _bitmap.y = _label.x + _bitmap.height; _bitmap.x = _label.y + _bitmap.width; } } } } } } 其实ChartTitleRenderer.as 是copy了官方的ChartLabel.as ,将其中的代码改了一点。
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值