PDA

Просмотр полной версии : проблема с отловом "onReleaseOutside"


FSBmipt
05.01.2006, 02:10
Неожидпнно возникла проблема с отловом события - аналогом 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();

это типа намёки, но я тебе ничё не гворил, ок?

silin
05.01.2006, 12:35
>>Если рисовать в текущем и вешать обработчик MOUSE_UP на текущий спрайт, то ошибок нет, но события не диспатчатся ... Интересно было бы понять почему.
похоже потому, что события генерятся для DisplayObject, которых в этом случае нет,
поставь parent.addEventListener(MouseEventType.MOUSE_UP, onMouseUp), и все заработает..

FSBmipt
05.01.2006, 16:06
Еще вчера разобрался в примере silin'а testDistort посмотрел :)

BlooDHounD
05.01.2006, 16:51
тоСлин: Всё там диспатчится. и вешать на парент - это не отсюда.

silin
05.01.2006, 17:00
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.

silin
05.01.2006, 18:42
2BlooDHounD
вопрос был в том почему листенер, повешаный на спрайт без детей, а только с графикой не работает..
т.е. почему в этом случае
addEventListener(MouseEventType.MOUSE_UP, onMouseUp); не работает,а
parent.addEventListener(MouseEventType.MOUSE_UP, onMouseUp); работает
причем здесь 'посыпятся ерроры', гуд/негуд..

BlooDHounD
05.01.2006, 19:18
блін.
1. ну почему же? у меня он работает.
2. вопрос был в том как споймать onReleaseOutSide. Причём тут нарисованн он или не нарисован. У меня все спрайты сейчас рисованные и они не только Диспатчаться он и ваще много что делают. парент это не из этой оперы. повторяю что патерна нету в природе как такогого. про него забыть нужно. Так как его может и не быть в момент назначения события и появится ошибка. События нужно вешать на те объекты на котрых оно будет стабильно. А если в parentе оно вообще перегружено? что тогда делать?

silin
05.01.2006, 19:34
Плюс, пока писал демку возник вопрос (скорее для понимания). Если в демке не использовать новый спрайт, а рисовать в текущем (т.е. var sprite:Sprite = new Sprite(); - убрать) и вешать обработчик MOUSE_UP на текущий спрайт, то ошибок нет, но события не диспатчатся (пробовал только на мышовых). Интересно было бы понять почему.
конкретный пример см. выше (мой второй пост), если у тебя он работает, тем более надо разобраться почему у нас нет..

BlooDHounD
05.01.2006, 20:07
ну совсем запутали :) сейчас сяду разбираться.

FSBmipt
11.01.2006, 12:55
Если повесить обработчик таким образом, то на выходе получаем:
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);
}
}


Как заставить работать второй пример?