Как в Flex 4.5 добавить всплывающую подсказку к InlineGraphicElement внутри TextFlow (TLF) с помощью ActionScript (не MXML)?

var newParagraph : ParagraphElement = new ParagraphElement();

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

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

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

Ваше здоровье


person Richard Haven    schedule 27.05.2011    source источник


Ответы (3)


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

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

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

person maxmil    schedule 22.12.2011

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

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

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

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

Удачи!

изменить

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

person drkstr    schedule 27.05.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');
    }
}
person RIAstar    schedule 27.05.2011
comment
Вы правы, это было бы эффективнее. Чтобы работать с actionscript (и я предполагаю, что OP работает с динамическим текстом), ему нужно будет проанализировать текстовый поток и создать список элементов для проверки попадания. - person drkstr; 28.05.2011