Просмотр полной версии : проблема с отловом "onReleaseOutside"
Неожидпнно возникла проблема с отловом события - аналогом AS 2.0 'onReleaseOuside'.
В хелпе сказано следующее про MouseEventType.MOUSE_UP:
Replaces ActionScript 2.0 event(s) Mouse.onMouseUp, MovieClip.onMouseUp, Button.onReleaseOutside, MovieClip.onReleaseOutside, onClipEvent(mouseUp), on(releaseOutside).
Однако на деле при отпускании вне спрайта никакого ивента не диспатчится :-\
Вот демка:
package {
import flash.display.Sprite;
import flash.events.*;
import flash.util.trace;
public class ReleaseOutSideDemo extends Sprite {
public function ReleaseOutSideDemo() {
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xcccccc);
sprite.graphics.drawRect(0, 0, 100, 100);
sprite.graphics.endFill();
sprite.addEventListener(MouseEventType.MOUSE_UP, onMouseUp);
addChild(sprite);
}
public function onMouseUp(e : MouseEvent):Void{
trace(e.type);
}
}
}
Плюс, пока писал демку возник вопрос (скорее для понимания). Если в демке не использовать новый спрайт, а рисовать в текущем (т.е. var sprite:Sprite = new Sprite(); - убрать) и вешать обработчик MOUSE_UP на текущий спрайт, то ошибок нет, но события не диспатчатся (пробовал только на мышовых). Интересно было бы понять почему.
BlooDHounD
05.01.2006, 04:32
Смотрим тутор у майка про палитру :)
setCapture();
releaseCapture();
это типа намёки, но я тебе ничё не гворил, ок?
>>Если рисовать в текущем и вешать обработчик MOUSE_UP на текущий спрайт, то ошибок нет, но события не диспатчатся ... Интересно было бы понять почему.
похоже потому, что события генерятся для DisplayObject, которых в этом случае нет,
поставь parent.addEventListener(MouseEventType.MOUSE_UP, onMouseUp), и все заработает..
Еще вчера разобрался в примере silin'а testDistort посмотрел :)
BlooDHounD
05.01.2006, 16:51
тоСлин: Всё там диспатчится. и вешать на парент - это не отсюда.
package {
import flash.display.Sprite;
import flash.events.*;
import flash.util.trace;
public class ReleaseOutSideDemo extends Sprite {
public function ReleaseOutSideDemo() {
graphics.beginFill(0xcccccc);
graphics.drawRect(0, 0, 100, 100);
graphics.endFill();
addEventListener(MouseEventType.MOUSE_UP, onMouseUp);
}
public function onMouseUp(e : MouseEvent):Void{
trace(e.type);
}
}
} так молчит, например..
>>и вешать на парент - это не отсюда
не понял: что не отсюда.. :rolleyes:
BlooDHounD
05.01.2006, 18:16
Вешать событие на родителя не катит. Это значит, что событие будет уже не самого объекта, а его родителя, а это не есть гуд. К тому же парента может и не быть. Всё таки это временная переменная, и тогда у тя посыпятся ерроры. public function Box(w:Number = 30, h:Number = 255)
{
this.graphics.beginFill(0x000000);
this.graphics.drawRect(0, 0, w, h);
this.graphics.endFill();
this.addEventListener(MouseEventType.MOUSE_DOWN, this.onPress, true);
}
// функция срабатывает на нажатие
private function onPress(event:MouseEvent):Void
{
// ПРИМИЧАНИЕ: попробуйте закомментировать эту строку и повторить манипуляции
// Увидим, что при выводе мышки за границы объекта, происходит
// не то, что ожидается от неё.
this.setCapture();
// из-за неразберихи с областью действия и последовательностью обновления
// назначаем события обработки "отпускания" и "движения" после нажатия.
this.addEventListener(MouseEventType.MOUSE_MOVE, this.onMouseMove);
this.addEventListener(MouseEventType.MOUSE_UP, this.onRelease);
}
// функция срабатывает на отпускание мыши
private function onRelease(event:MouseEvent):Void
{
// удаляем события
this.removeEventListener(MouseEventType.MOUSE_MOVE, this.onMouseMove);
this.removeEventListener(MouseEventType.MOUSE_UP, this.onRelease);
// проводим не хитрую операцию, которая возвращает область захвата в исходное состояние
this.releaseCapture();
}
// функция срабатывает на движение мышки
private function onMouseMove(event:MouseEvent):Void
{
event.updateAfterEvent();
}в removeEventListener и addEventListener 3 парметр как раз реакция на этот самый setCapture, releaseCapture. Можно начать 2 события, но с разным параметром, и события будут происзодить в разное вмея. Сдесь например срабатывает releaseOutSide.
2BlooDHounD
вопрос был в том почему листенер, повешаный на спрайт без детей, а только с графикой не работает..
т.е. почему в этом случае
addEventListener(MouseEventType.MOUSE_UP, onMouseUp); не работает,а
parent.addEventListener(MouseEventType.MOUSE_UP, onMouseUp); работает
причем здесь 'посыпятся ерроры', гуд/негуд..
BlooDHounD
05.01.2006, 19:18
блін.
1. ну почему же? у меня он работает.
2. вопрос был в том как споймать onReleaseOutSide. Причём тут нарисованн он или не нарисован. У меня все спрайты сейчас рисованные и они не только Диспатчаться он и ваще много что делают. парент это не из этой оперы. повторяю что патерна нету в природе как такогого. про него забыть нужно. Так как его может и не быть в момент назначения события и появится ошибка. События нужно вешать на те объекты на котрых оно будет стабильно. А если в parentе оно вообще перегружено? что тогда делать?
Плюс, пока писал демку возник вопрос (скорее для понимания). Если в демке не использовать новый спрайт, а рисовать в текущем (т.е. var sprite:Sprite = new Sprite(); - убрать) и вешать обработчик MOUSE_UP на текущий спрайт, то ошибок нет, но события не диспатчатся (пробовал только на мышовых). Интересно было бы понять почему.
конкретный пример см. выше (мой второй пост), если у тебя он работает, тем более надо разобраться почему у нас нет..
BlooDHounD
05.01.2006, 20:07
ну совсем запутали :) сейчас сяду разбираться.
Если повесить обработчик таким образом, то на выходе получаем:
1
3
с target'ом child и currentTarget - спрайт EventsDemo.
public class EventsDemo extends Sprite {
private var child:Sprite;
public function EventsDemo() {
addChild(child = new Sprite());
draw(child);
onChildClick);
addEventListener(MouseEventType.CLICK, onChildClick, false);
addEventListener(MouseEventType.CLICK, onChildClick, true);
}
private function draw(sprite:Sprite):Void{
sprite.graphics.beginFill(0, 0.2);
sprite.graphics.drawRect(0, 0, 200, 200);
sprite.graphics.endFill();
}
protected function onChildClick(e : MouseEvent):Void{
trace(e.eventPhase);
}
}
Однако, если не добавлять child, то никакого события не вызывается:
public class EventsDemo extends Sprite {
private var child:Sprite;
public function EventsDemo() {
draw(this);
onChildClick);
addEventListener(MouseEventType.CLICK, onChildClick, false);
addEventListener(MouseEventType.CLICK, onChildClick, true);
}
private function draw(sprite:Sprite):Void{
sprite.graphics.beginFill(0, 0.2);
sprite.graphics.drawRect(0, 0, 200, 200);
sprite.graphics.endFill();
}
protected function onChildClick(e : MouseEvent):Void{
trace(e.eventPhase);
}
}
Как заставить работать второй пример?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.