Просмотр полной версии : contextMenu и mouseEnabled
MerlinTwi
10.10.2006, 13:20
Проблема:
Если у мувиклипа стоит mouseEnabled=false, то при правом клике мышки его contextMenu игнорируется, а берется root.contextMenu, а не следующего мувиклипа под мышкой, как было бы логично предположить.
Ситуация:
Есть основной мувиклип со своим курсором, по ROLL_OVER системный мышиный курсор прячется, мой показывается, а при ROLL_OUT наоборот. У моего мышиного курсора стоит mouseEnabled=false иначе сразу срабатывает ROLL_OUT. У основного мувиклипа есть своя меню по правому кнопке мыши. Соответственно при наличии своего курсора мыши это меню не отображается.
Решение:
Пока вижу только такое: в момент показа своего курсора мыши присвоить root.contextMenu меню от основного мувиклипа. Но это как-то криво. Подскажите другие варианты.
Что-то мне кажется, что проблема в том, что ты скрыл курсор мыши, а не в contextMenu…
MerlinTwi
10.10.2006, 13:55
Не, курсор мыши тут ни при чем, проверял. Играет роль только то, что у мувика mouseEnabled=false
Ты деактивировал поведение мышки у мувика, поэтому берется контекстное меню у мувика, у которого мышка не деактивированна(root в твоем случае)
Попробуй курсор мыши юзать внутри твоего клипа.
MerlinTwi
10.10.2006, 14:12
Поправка, берется контекстное меню родителя а не обязательно рута.
Nirth, это-то понятно, вопрос что делать, если хочется и свой курсор и контекстное меню.
MerlinTwi
10.10.2006, 14:13
Попробуй курсор мыши юзать внутри твоего клипа.
Плохо, клип может быть с маской, и тогда курсор будет обрезаться на границе.
Делай общий мувик, в нём курсор и мувик со всем остальным. Маску на вложенный мувик накладывай. А контекстное меню к общему контейнеру вешай.
Объясни плиз подробнее, я не могу точно понять, как построить пример.
у тебя есть какой то мувик, в котором курсор заменяется на кастомный?
MerlinTwi
10.10.2006, 14:39
__etc, угу, как вариант... но тоже не красиво.
Nirth, да, мувик с кастомным курсором и контекстное меню. Пример в аттаче.
а если юзать MOUSE_OVER\MOUSE_OUT?
package {
import flash.display.Sprite;
import flash.ui.ContextMenu;
import flash.events.ContextMenuEvent;
public class Context extends Sprite
{
public function Context()
{
addChild(new Square());
}
private function onMenuSelect(event:ContextMenuEvent):void
{
}
}
}
import flash.display.Sprite;
import flash.events.*;;
import flash.ui.*;
class Square extends Sprite
{
public function Square()
{
graphics.beginFill(0xFF6600);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
var menu:ContextMenu = new ContextMenu();
menu.addEventListener(ContextMenuEvent.MENU_SELECT,onMenuSelect);
menu.customItems.push(new ContextMenuItem("Hello world"));
contextMenu = menu;
}
private var cursor:Cursor = new Cursor();
private function onMouseOver(event:MouseEvent):void
{
addChild(cursor);
Mouse.hide();
}
private function onMouseOut(event:MouseEvent):void
{
removeChild(cursor);
Mouse.show()
}
private function onMouseMove(event:MouseEvent):void
{
cursor.x = event.localX;
cursor.y = event.localY;
}
private function onMenuSelect(event:ContextMenuEvent):void
{
trace(this);
}
}
class Cursor extends Sprite
{
public function Cursor()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,10,10);
graphics.endFill();
mouseEnabled = false;
}
}
import flash.ui.ContextMenu;
import flash.events.MouseEvent;
import flash.display.Sprite;
var sp:Sprite = new Sprite();
var cursor:Sprite = new Sprite();
var cm:ContextMenu = new ContextMenu();
var cmItem:ContextMenuItem = new ContextMenuItem('cmItem');
/////////////////
cm.customItems.push(cmItem);
/////////////////
sp.graphics.beginFill(0xFF0000);
sp.graphics.drawRect(10,10,100,100);
sp.contextMenu = cm;
/////////////////
cursor.graphics.beginFill(0x0000FF);
cursor.graphics.drawRect(0,0,10,10);
cursor.visible = false;
mouseMove = function(e:MouseEvent):void {
e.updateAfterEvent();
}
mouseOver = function(e:MouseEvent):void {
Mouse.hide();
e.updateAfterEvent();
cursor.startDrag(true);
cursor.visible = true;
}
mouseOut = function(e:MouseEvent):void {
Mouse.show();
e.updateAfterEvent();
cursor.stopDrag();
cursor.visible = false;
}
/////////////////
this.addChild(sp);
this.addChild(cursor);
sp.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
sp.addEventListener(MouseEvent.MOUSE_OVER,mouseOver);
sp.addEventListener(MouseEvent.MOUSE_OUT,mouseOut);
Вроде работает… (Ну там, доработать надо)
ОФФТОП
а зачем ты во флэше импорты пишешь, там же вроде по умолчанию все импортированно? или я путаю
MerlinTwi
10.10.2006, 15:00
Nirth, в вашем примере курсор мыши добавляется внутрь мувика, а значит будет обрезаться, если у мувика будет маска.
__etc, частный вариант, для произвольного мувика не подойдет, но можно сделать контейнер только для мыши, и по mouseOver делать cursor.parent.contextMenu = e.target.contextMenu; Тогда все работает, только в событии MENU_SELECT будут неправильные target, что я переживу. Этот вариант мне подходит.
Всем спасибо :)
ОФФТОП
а зачем ты во флэше импорты пишешь, там же вроде по умолчанию все импортированно? или я путаю
На всякий случай.
__etc
я уже думал, а вдруг апдейт сделали, где надо вставлять и может еще че добавили... ну ладно
2 Мерлин
Я когда писал думал, что я делаю что то не так, но не мог понять что, догадался когда увидел код etc.
В твоем случае я бы сделал некий класс ContextMenuManager, который бы следил за менюшками, и передавал бы ссылки куда надо, так как event.target все равно не даст ссылки на дисплейобжект инициатор, а на ссылку контекстного меню, то кода на много больше всеравно не будет, если я правильно понял.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.