![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2010
Сообщений: 13
|
Есть приложение в которм используется AdvandcedDataGrid в ячейках которого используется графика. При наведении прорисовывается полупрозрачный прямоугольник в котором будет подсказка.
вот код самого визуализатора package { import flash.display.*; import flash.events.MouseEvent; import flash.filters.*; import flash.geom.*; import mx.containers.Panel; import mx.controls.TextArea; import mx.controls.listClasses.IListItemRenderer; import mx.core.IDataRenderer; import mx.core.UIComponent; import mx.events.FlexEvent; [Event(name="dataChange", type="mx.events.FlexEvent")] public class SimpleGanttRenderer extends UIComponent implements IDataRenderer, IListItemRenderer { private var bar:Sprite = new Sprite(); private var popup:Sprite = new Sprite(); private var _data : Object = null; /* здесь мы получаем исходные данные */ [Bindable("dataChange")] public function get data():Object { return _data; } public function set data(value:Object):void { this._data = value; this.invalidateProperties(); dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); } override protected function updateDisplayList(w:Number, h:Number):void { /* здесь прорисовываем наш график */ super.updateDisplayList(w, h); bar.graphics.clear(); if ( _data != null) { bar.graphics.lineStyle(1, 0xFF9000, 1); var r:Rectangle = calculateRectangle(w,h); // Задаем матрицу градиента var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(r.width, r.height, Math.PI*2, r.x, r.y); var xmlData : XML = XML(_data); var pos:uint; pos = (255/100)*xmlData.@progress; // Переводим % выполненной работы в % закрашенности прямоугольника // Градиентом закрашиваем всю работу (желтый) и % выполненной (зеленый) bar.graphics.beginGradientFill(GradientType.LINEAR, [0x24FF00, 0x24FF00, 0xFFB500, 0xFFB500], [1, 1, 1, 1], [0, pos, pos, 255], gradientBoxMatrix); // Добавляем эффект отбрасываемой тени var filter:Array = new Array(); var dFilter:DropShadowFilter = new DropShadowFilter(); dFilter.angle = 45; dFilter.distance = 4; dFilter.alpha = .4; filter.push(dFilter); bar.graphics.drawRect(r.x, r.y, r.width, r.height); // Рисуем прямоугольник this.filters = filter; // Заканчиваем рисование bar.graphics.endFill(); // Добавляем обработчик когда мышь наведена bar.addEventListener(MouseEvent.MOUSE_OVER, showPopupBox); bar.addEventListener(MouseEvent.MOUSE_MOVE, showPopupBox); bar.addEventListener(MouseEvent.MOUSE_OUT, hidePopupBox); addChild(bar); } } private function showPopupBox(e:MouseEvent):void { // сдесь прорисовываем нашу подсказку popup.graphics.clear(); var posX:uint = mouseX; var posY:uint = mouseY; popup.graphics.lineStyle(1, 0x000000, .2); popup.graphics.beginFill( 0xFFFFFF, .6); popup.graphics.drawRoundRectComplex(posX, posY, 150, 100, 5, 5, 5, 5); popup.graphics.endFill(); addChild(popup); } private function hidePopupBox(e:MouseEvent):void { popup.graphics.clear(); } private function calculateRectangle(w:Number, h:Number) : Rectangle { var xmlData : XML = XML(_data); var rect_x : int = 1+ ((w-2) * ( xmlData.@start/SimpleGanttUtil.duration )/2); var rect_y : int = 0; var rect_width : int = (w-0.2) * ( xmlData.@duration/SimpleGanttUtil.duration )/2; var rect_height : int = h-1; return new Rectangle( rect_x, rect_y, rect_width, rect_height ); } } } Для наглядности могу выложить скрин, если подскажете как =). |
|
|||||
|
Не удивительно, ведь у вас возникает перерисовка в остальных строках и она конечно же поверх вашего popup. Его вам надо чилдить минимум это к вашей гриде, а желательно вообще к аппликухе. Но в любом случае это не тру путь получится.
Мне кажется лучше смотреть в сторону ToolTipManager. Единственно ToolTip может содержать только текст. Но кто мешает его расширить, чтобы он у вас и рисовать научился ![]()
__________________
2+2=5 |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 13
|
а можно немного поподробнее про ToolTipManager
![]() Гуру спасибо, разобрался, теперь все работает как и хотел ![]() Последний раз редактировалось don_Lino; 29.01.2010 в 13:44. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|