В Flex 4.5, как добавить всплывающую подсказку к InlineGraphicElement внутри TextFlow (TLF), используя ActionScript (не MXML)? - PullRequest
1 голос
/ 27 мая 2011
var newParagraph : ParagraphElement = new ParagraphElement();

var icon : InlineGraphicElement = MY_ICON;
//   icon.toolTip = "boo"  ????
newParagraph.addChild( icon );

Я хочу специальную подсказку для «значка». Я читал об использовании HTML и rollOver и rollOut (например, Спасибо, Мистер ), но я строю это как часть более крупного текстового блока; в середине трудно переключиться с инкрементных объектов на HTML.

Если я не могу установить событие на значке, могу ли я создать HTML-бит в ActionScript как часть (но не все) абзаца?

Приветствия

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Я только что столкнулся с той же проблемой.

Самое простое решение, которое я нашел, - это обернуть мой InlineGraphicElement в LinkElement.

LinkElement уже отправляет события мыши.

1 голос
/ 28 мая 2011

Вы можете выполнить некоторое тестирование нажатия, когда мышь находится над компонентом текстового потока.

Предположим, у вас есть некоторый текстовый поток, подобный этому:

<s:RichEditableText width="100%" height="100%" mouseOver="toggleTooltip()">
    <s:textFlow>
        <s:TextFlow>
            <s:p>
                <s:span>Some text before</s:span>
                <s:img id="myImg" source="myImg.png" />
                <s:span>Some text after</s:span>
            </s:p>
        </s:TextFlow>
    </s:textFlow>
</s:RichEditableText>

И вы прослушиваете события mouseOver навесь текстовый компонент.

Затем, чтобы проверить, находится ли мышь над вашим изображением, реализуйте обработчик mouseOver:

private function toggleTooltip():void {
    var graphic:DisplayObject = myImg.graphic;
    var anchor:Point = graphic.localToGlobal(new Point(0, 0));

    if (mouseX >= anchor.x && mouseX <= anchor.x + graphic.width &&
        mouseY >= anchor.y && mouseY <= anchor.y + graphic.height) 
    {
        trace('show tooltip');
    }
    else {
        trace('hide tooltip');
    }
}
1 голос
/ 28 мая 2011

Проблема (как я уверен, вы узнали) состоит в том, что элементы текстового потока не являются экранными объектами и поэтому не реализуют нормальное поведение экранных объектов.

Что вам нужно сделать, это создать собственный InlineGraphicElement, который присоединяет нужные вам прослушиватели событий, а затем отправляет событие из экземпляра textFlow, чтобы его можно было прочитать где-то в иерархии экранных объектов (или любым другим выбранным вами методом нацелиться на это событие).

Хороший пример того, как добавить взаимодействие с мышью, можно увидеть, посмотрев на источник в LinkElement (см. Функцию createContentElement).

К сожалению, InlineGraphicElement помечен как окончательный, поэтому вам нужно будет дублировать его функциональность, а не расширять его. Просто убедитесь, что вы используете собственный графический элемент в вашем коде вместо обычного.

Удачи!

редактировать

На всякий случай, если точка была потеряна, идея в том, что вы можете захватить событие мыши где-нибудь в вашем приложении, подключив слушателя к textFlow, а затем программно создать и расположить подсказку над элементом, используя стандартные методы для поиска границы элемента текстового потока.

...