
MouseOver и MouseOut для линка в тексте. Часть1
Ну вот наконец-то и мой первый пост на блогах, я очень надеюсь что эта информация окажется полезной. Некоторой части AS3 кодеров возможно известно, что у текстового линка в htmlText совершенно невозможно подписаться на MouseOver и MouseOut, а иногда так хочется при наведении на некую часть текста например в хинте к игре показать что-нибудь этакое. Конечно можно вручную подкладывать невидимые кнопки и т.п., ну а если часть текста заскролена? Что же делать в таком случае? Вот мое решение:
Код самой кнопки до безобразия прост:
Возможно кто-то предложит более изящное решение, если есть идеи, то обязательно пишите в комменты.
Всем удачи и хорошего настроения;)
//вешаем ParseLink при создании текста (нужно сделать небольшую паузу например в
//один фрейм после задания текста иначе это свойство будет пустым)
//дополнительно вызываем парсинг ссылок при скроле
hint_text.addEventListener(Event.SCROLL, ParseLinks);
const LINK_HOVER:String = "HOVER";
const LINK_OUT:String = "OUT";
const LINK_CLICK:String = "CLICK";
public function ParseLinks(e:Event):void
{
//создаем массив из всех ссылок встречающихся в тексте
for each(var match:String in matches)
{
/*передаем текст ссылки в функцию создающую невидимую
кнопку на области в тексте где расположена ссылка*/
createButton(match.replace(/.*?>(.*?)<.*/gi, '$1'));///
}
}
private function createButton(_linkText:String):void
{
var index:Number = hint_text.text.indexOf(_linkText);
var r:Rectangle = hint_text.getCharBoundaries(index);
var r2:Rectangle = hint_text.getCharBoundaries(index +_linkText.length-1);
if(!r2) return;
r2.x += hint_text.x;
//делаем всю кнопку (как спрайт) только с возможностью добавить информацию о ссылке
var textButton:MyButton = drawSprite(r2.x - r.x+r2.width, r.height, _linkText);
textButton.x = r.x + hint_text.x;
textButton.y = r.y + hint_text.y;
//вешаем слушатели для событий мыши
textButton.addEventListener(MouseEvent.ROLL_OVER, handlingLinkEvents);
textButton.addEventListener(MouseEvent.ROLL_OUT, handlingLinkEvents);
textButton.addEventListener(MouseEvent.CLICK, handlingLinkEvents);
textButton.buttonMode = true;
}
private function drawSprite(w:Number, h:Number, _linkText:*):MyButton
{
var s:MyButton = new MyButton();
s.lnk = _linkText;
s.graphics.beginFill(0x000000, 0);
s.graphics.drawRect(0, 0, w, h);
stage.addChild(s);
return s;
}
private function handlingLinkEvents(e:MouseEvent):void
{
var type:String;
var mybtn:MyButton = e.currentTarget as MyButton;
switch(e.type)
{
case MouseEvent.ROLL_OVER:
type = LINK_HOVER;
//вот здесь можно получить тот линк,
//который передается при создании кнопки.
//Здесь можно вещать свое событие (я отнаследовался от EventDispatcher)
//например
break;
case MouseEvent.ROLL_OUT:
type = LINK_OUT;
break;
case MouseEvent.CLICK:
type = LINK_CLICK;
break;
}
}
Код самой кнопки до безобразия прост:
package BoxShell{
import flash.display.Sprite;
public class MyButton extends Sprite
{
public var lnk:*; //переменная для текста ссылки
}
}
Возможно кто-то предложит более изящное решение, если есть идеи, то обязательно пишите в комменты.
Всем удачи и хорошего настроения;)
- +10
- MXPain
Комментарии (6)
PS Парсеру от регэкспов поплохело, может воткнуть пробельчик где-нибудь, для красоты.
Окошки с описанием ачивментов: www.notdoppler.com/gibbets2.php
Smrdis спасибо, хорошие примеры.