Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Renderer и порядок слоев (http://www.flasher.ru/forum/showthread.php?t=135581)

don_Lino 26.01.2010 20:08

Renderer и порядок слоев
 
Есть приложение в которм используется AdvandcedDataGrid в ячейках которого используется графика. При наведении прорисовывается полупрозрачный прямоугольник в котором будет подсказка.
вот код самого визуализатора
Код AS3:

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 оказывается под объектами bar, а должен отображаться поверх всех объектов. Как это реализовать?
Для наглядности могу выложить скрин, если подскажете как =).

BeDLiNt 26.01.2010 22:50

Не удивительно, ведь у вас возникает перерисовка в остальных строках и она конечно же поверх вашего popup. Его вам надо чилдить минимум это к вашей гриде, а желательно вообще к аппликухе. Но в любом случае это не тру путь получится.
Мне кажется лучше смотреть в сторону ToolTipManager. Единственно ToolTip может содержать только текст. Но кто мешает его расширить, чтобы он у вас и рисовать научился:)

don_Lino 28.01.2010 14:16

а можно немного поподробнее про ToolTipManager :rolleyes:


Гуру спасибо, разобрался, теперь все работает как и хотел :away:


Часовой пояс GMT +4, время: 05:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.