Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   До объекта не доходит событие (http://www.flasher.ru/forum/showthread.php?t=146042)

BornTOFree 27.10.2010 14:12

До объекта не доходит событие
 
Вложений: 1
Если первый объект перекрывается вторым, то до первого объекта не доходит событие.

В примере это хорошо видно. Красный прямоугольник, это не видимый объект, для того чтобы использовать событие MOUSE_WHEEL, под ним расположены три кнопки и если красный прямоугольник перекрывает кнопки, то до них не доходят события, как это исправить?

Obi 27.10.2010 14:32

Повесить MOUSE_WHEEL на контейнер, содержащий все нужные объекты, использовать метод getObjectUnderPoint для получения объектов под мышкой.

BornTOFree 28.10.2010 14:31

Вложений: 1
getObjectUnderPoint работает. Но я не могу понять, он работает когда я щелкаю по объектам, а когда использую MOUSE_OVER то события до объектов опять же не доходят. Вот пример и код:

Код AS3:

package {
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.text.TextField;
        import flash.ui.Mouse;
 
        [SWF(backgroundColor="0xFFFFFF", width="800", height="600", frameRate="30")]
 
        public class Main extends Sprite {
 
                private var txt:TextField
                private var container:Sprite
 
 
                public function Main() {
                        init();
                }
 
                private function init():void {
                        txt = new TextField();
 
                        container = new Sprite();
                        addChild(container)
 
                        for(var i:uint = 0; i<3; i++){
 
                                var sp:Sprite = new Sprite();
                                container.addChild(sp);
 
                                sp.name = "button: "+i
 
                                sp.graphics.beginFill(0x000000, 0.7);
                                sp.graphics.drawRect(100, 100, 100, 50);
                                sp.graphics.endFill();
                                sp.y = Number(sp.y + sp.height+10)*i;
 
                                addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
 
                                addEventListener(MouseEvent.CLICK, clickListener);
 
                        }
 
                        var bg:Sprite = new Sprite();
                        addChild(bg);
                        bg.addChild(txt);
 
                        bg.name = "BG"
 
                        bg.graphics.beginFill(0xF5003D,0.5);
                        bg.graphics.drawRect(150, 100, 100, 170);
                        bg.graphics.endFill();
                        bg.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
 
                }
 
                private function clickListener (e:MouseEvent):void {
                        var p:Point = new Point(e.stageX, e.stageY);
 
                        var arr:Array = container.getObjectsUnderPoint(p);
 
                        checkInfo(arr);
 
                }
 
                private function checkInfo (arr:Array):void {                       
                        var info:String;
                        for (var i:uint = arr.length; i--; ){
                                info = arr[i].name + " ";
                                arr[i].alpha = 0.5
                        }
 
                        trace(info);
                }
 
                private function mouseOver(e:MouseEvent):void {
 
                        var p:Point = new Point(e.stageX, e.stageY);
 
                        var arr:Array = container.getObjectsUnderPoint(p);
 
                        checkInfo(arr);
                }
 
                private function mouseWheel(e:MouseEvent):void {
 
                        txt.text = "wheel"
 
                }
 
        }
}


leofit 28.10.2010 15:21

А Вам вообще нужно ловить события на прямоугольнике?
Во первых, он называется bg(background?) но в списке отображения находится выше кнопок
Во вторых не мешало бы сделать
Код AS3:

bg.name = "BG"
bg.mouseEnabled = false;

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

BornTOFree 29.10.2010 07:43

bg подразумевалось, как область для мыши. Расположено всё верно. В чем собственно и суть вопроса.
Красный прямоугольник - это область для события MOUSE_WHEEL, убивать его свойством mouseEnabled нет необходимости.

Замысел простой (: Те 3 кнопки, это некоторый список, который нужно прокручивать, поэтому с верху, над ними, находится красный прямоугольник - область для события MOUSE_WHEEL.

Возможно, я чего не догоняю и нужно всё по другому организовать для правильной работы.

Obi 29.10.2010 11:40

Ваши объекты и не будут диспатчить мышиные события, если перекрыты InteractiveObject'ами с включенным mouseEnabled. Предполагалось, что по MOUSE_WHEEL у контейнера, где находятся все нужные объекты, вы будете искать детей, находящихся под мышкой, используя метод getObjectsUnderPoint. Результат будет тот-же, как если бы у вас все объекты диспатчили MOUSE_WHEEL

Хотя у меня большие сомнения, что решение, которое вызвало необходимость таких извращений, правильное. Опишите ситуацию в целом, может что-то умное подскажем :)

Добавлено через 4 минуты
Цитата:

Сообщение от BornTOFree (Сообщение 946006)
getObjectUnderPoint работает. Но я не могу понять, он работает когда я щелкаю по объектам, а когда использую MOUSE_OVER то события до объектов опять же не доходят. Вот пример и код:

Код AS3:

package {
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.text.TextField;
        import flash.ui.Mouse;
 
        [SWF(backgroundColor="0xFFFFFF", width="800", height="600", frameRate="30")]
 
        public class Main extends Sprite {
 
                private var txt:TextField
                private var container:Sprite
 
 
                public function Main() {
                        init();
                }
 
                private function init():void {
                        txt = new TextField();
 
                        container = new Sprite();
                        addChild(container)
 
                        for(var i:uint = 0; i<3; i++){
 
                                var sp:Sprite = new Sprite();
                                container.addChild(sp);
 
                                sp.name = "button: "+i
 
                                sp.graphics.beginFill(0x000000, 0.7);
                                sp.graphics.drawRect(100, 100, 100, 50);
                                sp.graphics.endFill();
                                sp.y = Number(sp.y + sp.height+10)*i;
 
                                addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
 
                                addEventListener(MouseEvent.CLICK, clickListener);
 
                        }
 
                        var bg:Sprite = new Sprite();
                        addChild(bg);
                        bg.addChild(txt);
 
                        bg.name = "BG"
 
                        bg.graphics.beginFill(0xF5003D,0.5);
                        bg.graphics.drawRect(150, 100, 100, 170);
                        bg.graphics.endFill();
                        bg.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
 
                }
 
                private function clickListener (e:MouseEvent):void {
                        var p:Point = new Point(e.stageX, e.stageY);
 
                        var arr:Array = container.getObjectsUnderPoint(p);
 
                        checkInfo(arr);
 
                }
 
                private function checkInfo (arr:Array):void {                       
                        var info:String;
                        for (var i:uint = arr.length; i--; ){
                                info = arr[i].name + " ";
                                arr[i].alpha = 0.5
                        }
 
                        trace(info);
                }
 
                private function mouseOver(e:MouseEvent):void {
 
                        var p:Point = new Point(e.stageX, e.stageY);
 
                        var arr:Array = container.getObjectsUnderPoint(p);
 
                        checkInfo(arr);
                }
 
                private function mouseWheel(e:MouseEvent):void {
 
                        txt.text = "wheel"
 
                }
 
        }
}



Код AS3:

private function mouseOver(e:MouseEvent):void {
 
var p:Point = new Point(container.mouseX, container.mouseY);
 
var arr:Array = container.getObjectsUnderPoint(p);
 
checkInfo(arr);
}


BornTOFree 29.10.2010 17:21

Вложений: 1
Цитата:

Ваши объекты и не будут диспатчить мышиные события, если перекрыты InteractiveObject'ами с включенным mouseEnabled.
А почему тогда события по клику диспатчатся?

Ситуация в целом:

Есть SQLite база нужно данные базы разбить в список в виде кнопок. Этот список может быть большим и не помещаться на экране, поэтому его нужно прокручивать. Использовать компоненты я в принципе не хочу.

Вот пример, я как мог упростил проектирование приложения, многое по не надобности откоцал, но разумеется суть осталась.

Класс UserView описывает одну кнопку. Этот класс так же понимает, что, если на него навели мышкой MOUSE_OVER, то он меняет свое свойство, в данном случае alpha.

Класс UsersList наследует модель класса SQLitePManager. Наследование я откоцал, записал построение списка через цикл. Т.е. UsersList создает список из UserView.

Далее класс ManagersUsers берет готовый список UsersList добавляет к списку кнопки управления, объект поверх списка для скроллирования, который в свою очередь и перекрывает доступ событий.

Есть вариант, повесить MOUSE_MOVE и проверять постоянно расположение мыши и если мышь попадает в нужные координаты, то можно скроллить, но это совсем убогий вариант, на самый крайний случай.

Цитата:

Код:

var p:Point = new Point(container.mouseX, container.mouseY);

Тот же результат.

BornTOFree 29.10.2010 17:29

А что понимается под "необходимость таких извращений"?

То, что я один объект положил на другой? Я просто не понимаю.


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

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