|
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
До объекта не доходит событие
Если первый объект перекрывается вторым, то до первого объекта не доходит событие.
В примере это хорошо видно. Красный прямоугольник, это не видимый объект, для того чтобы использовать событие MOUSE_WHEEL, под ним расположены три кнопки и если красный прямоугольник перекрывает кнопки, то до них не доходят события, как это исправить? |
|
|||||
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Повесить MOUSE_WHEEL на контейнер, содержащий все нужные объекты, использовать метод getObjectUnderPoint для получения объектов под мышкой.
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
getObjectUnderPoint работает. Но я не могу понять, он работает когда я щелкаю по объектам, а когда использую MOUSE_OVER то события до объектов опять же не доходят. Вот пример и код:
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" } } } |
|
|||||
Регистрация: Dec 2009
Сообщений: 428
|
А Вам вообще нужно ловить события на прямоугольнике?
Во первых, он называется bg(background?) но в списке отображения находится выше кнопок Во вторых не мешало бы сделать В этом случае прямоугольник не будет перехватывать события мыши. Но, мб, я просто не понял Ваших замыслов
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
bg подразумевалось, как область для мыши. Расположено всё верно. В чем собственно и суть вопроса.
Красный прямоугольник - это область для события MOUSE_WHEEL, убивать его свойством mouseEnabled нет необходимости. Замысел простой (: Те 3 кнопки, это некоторый список, который нужно прокручивать, поэтому с верху, над ними, находится красный прямоугольник - область для события MOUSE_WHEEL. Возможно, я чего не догоняю и нужно всё по другому организовать для правильной работы. |
|
|||||
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Ваши объекты и не будут диспатчить мышиные события, если перекрыты InteractiveObject'ами с включенным mouseEnabled. Предполагалось, что по MOUSE_WHEEL у контейнера, где находятся все нужные объекты, вы будете искать детей, находящихся под мышкой, используя метод getObjectsUnderPoint. Результат будет тот-же, как если бы у вас все объекты диспатчили MOUSE_WHEEL
Хотя у меня большие сомнения, что решение, которое вызвало необходимость таких извращений, правильное. Опишите ситуацию в целом, может что-то умное подскажем Добавлено через 4 минуты Цитата:
__________________
#flasher@irc.trg.ru:6667 Последний раз редактировалось Obi; 29.10.2010 в 11:43. |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
Цитата:
Ситуация в целом: Есть SQLite база нужно данные базы разбить в список в виде кнопок. Этот список может быть большим и не помещаться на экране, поэтому его нужно прокручивать. Использовать компоненты я в принципе не хочу. Вот пример, я как мог упростил проектирование приложения, многое по не надобности откоцал, но разумеется суть осталась. Класс UserView описывает одну кнопку. Этот класс так же понимает, что, если на него навели мышкой MOUSE_OVER, то он меняет свое свойство, в данном случае alpha. Класс UsersList наследует модель класса SQLitePManager. Наследование я откоцал, записал построение списка через цикл. Т.е. UsersList создает список из UserView. Далее класс ManagersUsers берет готовый список UsersList добавляет к списку кнопки управления, объект поверх списка для скроллирования, который в свою очередь и перекрывает доступ событий. Есть вариант, повесить MOUSE_MOVE и проверять постоянно расположение мыши и если мышь попадает в нужные координаты, то можно скроллить, но это совсем убогий вариант, на самый крайний случай. Тот же результат. |
|
|||||
Регистрация: Oct 2010
Сообщений: 85
|
А что понимается под "необходимость таких извращений"?
То, что я один объект положил на другой? Я просто не понимаю. |
Часовой пояс GMT +4, время: 23:10. |
|
« Предыдущая тема | Следующая тема » |
|
|