Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.01.2010, 20:08
don_Lino вне форума Посмотреть профиль Отправить личное сообщение для don_Lino Найти все сообщения от don_Lino
  № 1  
Ответить с цитированием
don_Lino

Регистрация: Jan 2010
Сообщений: 13
По умолчанию 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, а должен отображаться поверх всех объектов. Как это реализовать?
Для наглядности могу выложить скрин, если подскажете как =).

Старый 26.01.2010, 22:50
BeDLiNt вне форума Посмотреть профиль Отправить личное сообщение для BeDLiNt Найти все сообщения от BeDLiNt
  № 2  
Ответить с цитированием
BeDLiNt
 
Аватар для BeDLiNt

Регистрация: Mar 2008
Адрес: Moscow
Сообщений: 311
Отправить сообщение для BeDLiNt с помощью ICQ Отправить сообщение для BeDLiNt с помощью Skype™
Не удивительно, ведь у вас возникает перерисовка в остальных строках и она конечно же поверх вашего popup. Его вам надо чилдить минимум это к вашей гриде, а желательно вообще к аппликухе. Но в любом случае это не тру путь получится.
Мне кажется лучше смотреть в сторону ToolTipManager. Единственно ToolTip может содержать только текст. Но кто мешает его расширить, чтобы он у вас и рисовать научился
__________________
2+2=5

Старый 28.01.2010, 14:16
don_Lino вне форума Посмотреть профиль Отправить личное сообщение для don_Lino Найти все сообщения от don_Lino
  № 3  
Ответить с цитированием
don_Lino

Регистрация: Jan 2010
Сообщений: 13
а можно немного поподробнее про ToolTipManager


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


Последний раз редактировалось don_Lino; 29.01.2010 в 13:44.
Создать новую тему Ответ Часовой пояс GMT +4, время: 02:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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