Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 19-10-2011, 11:58   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Release Outside in As3?

Hallo,

folgende Situation:


Ich habe eine Komponente in As3 gebaut (eine Kombobox) und benutze diese je nach Unterseite bis zu 5 mal.
Wie bei einer Drop-DownBox / Kombobox üblich gibt es eine kleine Liste die ausfährt, wenn man auf die Box klickt.

Ich frage mich jetzt, wie ich es schaffe dass sich diese Box wieder "einfährt", wenn ich mit der Maus woanders als auf die Box klicke.
Bin da gerade etwas am verzweifeln, da ich nicht auf die Lösung komme.

Auf die Stage einen Listener zu setzen bringt nichts, da über die Stage noch Bilder und anderes Zeugs liegt.



Jemand ne Idee?
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Alt 19-10-2011, 12:58   #2 (permalink)
Neuer User
 
Benutzerbild von andrelehnert
 
Registriert seit: Oct 2007
Ort: Kölle
Beiträge: 1.231
Hi,

doch doch - mit dem Listener auf der stage bist Du auf der richtigen Spur.
Die Events kommen kommen auf jeden Fall an, auch wenn es andere
Objekte sind.
hier mal ein kleines Beispiel

PHP-Code:
import flash.events.MouseEvent;
import flash.display.Sprite;

//btn im Beispiel auf der Bühne

btn.addEventListener(MouseEvent.CLICK,activeHandler);

function 
activeHandler(e:MouseEvent):void{
    
btn.scaleY=2;
    
btn.removeEventListener(MouseEvent.CLICK,activeHandler);    
    
btn.addEventListener(MouseEvent.CLICK,inactiveHandler);
    
stage.addEventListener(MouseEvent.MOUSE_DOWN,inactiveByStageAction);
}
function 
inactiveHandler(e:MouseEvent):void{
    
    
btn.scaleY=1;
    
btn.removeEventListener(MouseEvent.CLICK,inactiveHandler);
    
btn.addEventListener(MouseEvent.CLICK,activeHandler);    
    
stage.removeEventListener(MouseEvent.MOUSE_DOWN,inactiveHandler);
}

function 
inactiveByStageAction(e:MouseEvent):void{
    if(
e.target == btn) return;
    
btn.scaleY=1;
    
stage.removeEventListener(MouseEvent.MOUSE_DOWN,inactiveHandler);
    
btn.removeEventListener(MouseEvent.CLICK,inactiveHandler);
    
btn.addEventListener(MouseEvent.CLICK,activeHandler);    

weiss | stage
grün | weiterer MC
grau | Button

LG ANdré
Angehängte Dateien
Dateityp: swf clickOutSide_AS3.swf (1,2 KB, 11x aufgerufen)
__________________
Die Hoffnung stirbt zuletzt.
Aber sie stirbt.
andrelehnert ist offline   Mit Zitat antworten
Alt 20-10-2011, 13:40   #3 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Hm also irgendwie komme ich da auf keinen grünen Zweig....


Die Haupt-Stage meiner Applikation habe ich in einem Model gespeichert.
Daher wollte ich jetzt in meiner Combobox was ala

Resources.MAIN_STAGE.addEventListener(MouseEvent.C LICK)


machen. jetzt muss ich ja irgendwie von der stage auf meine Combobox kommen... Versuche hier gerade was ala

"e.target.parent.parent.parent"

Aber das kann's ja irgendwie nicht sein...




Mir fehlt da gerade total der Ansatz,freu mich über nen Denkanstoß.


Grüße, nico
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Alt 20-10-2011, 13:47   #4 (permalink)
Neuer User
 
Benutzerbild von padavan
 
Registriert seit: Apr 2002
Beiträge: 496
du kannst es doch genau wie im beispiel von andre machen

nur musst du vorher Event.ADDED_TO_STAGE abfangen damit du die stage als property von this bekommst - dann brauchst du sie auch nicht aus dem model zu holen
__________________
Grafik - Webdesign - Programmierung - www.thsc.at
Adventkalender 2011 advent.wien.info/de
Jobspace - Universum der Lehrstellen www.jobspace.at
padavan ist offline   Mit Zitat antworten
Alt 20-10-2011, 14:08   #5 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Genau das meine ich ja... this ist in diesem Falle die Combobox...

Ich versuche aus der Combobox heraus auf die mainstage zuzugreifen... Ist das die falsche Vorgehensweise?
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Alt 20-10-2011, 15:46   #6 (permalink)
Neuer User
 
Benutzerbild von andrelehnert
 
Registriert seit: Oct 2007
Ort: Kölle
Beiträge: 1.231
eine eigenschaft deiner combobox ist stage, nachdem sie geadded wurde..

PHP-Code:
this.stage.addEventListsner(MouseEvent.CLICKclickHandler); 
LG ANdré
__________________
Die Hoffnung stirbt zuletzt.
Aber sie stirbt.
andrelehnert ist offline   Mit Zitat antworten
Alt 20-10-2011, 16:05   #7 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
aber combobox.stage ist doch nicht stage der Mainclass ?? (oder doch?, das wäre mir jetzt peinlich)
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Alt 20-10-2011, 16:14   #8 (permalink)
Neuer User
 
Benutzerbild von andrelehnert
 
Registriert seit: Oct 2007
Ort: Kölle
Beiträge: 1.231
DOCH

LG ANdré
__________________
Die Hoffnung stirbt zuletzt.
Aber sie stirbt.
andrelehnert ist offline   Mit Zitat antworten
Alt 20-10-2011, 16:18   #9 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Oje.... ähm ja danke, ich versuch dann mal weiter rum.

So ganz sehe ich deshalb die Lösung nämlich noch nicht.
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Alt 20-10-2011, 16:35   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ich versuch mal mein glück ;-)

es gibt nur ein stage. alle objekte, die direkt auf der bühne stehen, bzw. in objekten, die ihrerseits auf der bühne stehen usw. haben eine direkte referenz auf die eine bühne.

bei einem klick z.b. sausst das event vom angeklickten objekt den pfad runter bis zur bühne und dann wieder zurück. falls nicht irgendwo gestoppt.

deine combobox kann über einen listener auf der bühne alle klicks die dort ankommen abhören (oder auch weiter oben im pfad, falls da ein objekt bekannt ist und da das 'outside' definiert ist). wenn event.target nicht die combobox ist, dann wurde wohl was anderes geklickt. das wäre dann das alte 'onReleaseOutside'.

geht es um clicks auf die combobox selbst, dann hörst du mit einem listener natürlich die combobox direkt ab.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (20-10-2011 um 16:37 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 20-10-2011, 19:53   #11 (permalink)
Neuer User
 
Benutzerbild von andrelehnert
 
Registriert seit: Oct 2007
Ort: Kölle
Beiträge: 1.231
Zitat:
Oje.... ähm ja danke, ich versuch dann mal weiter rum.
So ganz sehe ich deshalb die Lösung nämlich noch nicht.
Zeig doch mal n bisschen Code, weil von uns aus ist nun tatsächlich alles gesagt.

LG ANdré
__________________
Die Hoffnung stirbt zuletzt.
Aber sie stirbt.
andrelehnert ist offline   Mit Zitat antworten
Alt 26-10-2011, 08:30   #12 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Zitat:
deine combobox kann über einen listener auf der bühne alle klicks die dort ankommen abhören (oder auch weiter oben im pfad, falls da ein objekt bekannt ist und da das 'outside' definiert ist). wenn event.target nicht die combobox ist, dann wurde wohl was anderes geklickt. das wäre dann das alte 'onReleaseOutside'.
Genau das meine ich ja. (vom Gedankengang her wollte ich das Gleiche machen)


Nur: Ich habe auf meiner Bühne zig Sachen liegen, Buttons, Hintergrundbild usw... ich hätte jetzt in meiner Combobox diese Zeilen hier:

ActionScript:
  1. protected function onDropDownButtonClick(e:MouseEvent):void
  2.         {
  3.            
  4.             if( !this._dropListVisible )            // False
  5.             {
  6.                 showDropList();
  7.                 this.stage.addEventListener(MouseEvent.CLICK, onClick);
  8.             }               
  9.             else
  10.             {
  11.                 hideDropList();
  12.                 this.stage.removeEventListener(MouseEvent.CLICK, onClick);
  13.             }
  14.            
  15.            
  16.            
  17.         }
  18.        
  19.         protected function onClick(e:MouseEvent):void
  20.         {
  21.             trace( e.target);
  22.         }
(Ich denke die Benennung ist eindeutig und es wird klar, was gemacht wird)


In der onClick kann ich jetzt ja nicht für jedes andere Objekt( Buttons, Hintergrundbild usw.) abfragen, ob es das ist, wenn nicht dann die Liste schließen.

Das ist ja ziemlich umständlich ?

Ein
ActionScript:
  1. trace( e.target == this)
geht natürlich nicht. :/


Man könnte natürlich von "aussen" einen Listener setzen, aber ich wollte das gerne alles innerhalb meiner Komponente regeln.
__________________
Mein Blog
Freue mich über jeden Besucher. :)

Geändert von Nico B. (26-10-2011 um 08:31 Uhr)
Nico B. ist gerade online   Mit Zitat antworten
Alt 26-10-2011, 09:36   #13 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
einfach:
PHP-Code:
private function onClick(e:MouseEvent):void
    
if(dropList.contains(e.target) == false){
        
hideDropList();
        
this.stage.removeEventListener(MouseEvent.CLICKonClick);
    }

und das selbe im Eigenbau:
PHP-Code:
private function onClick(e:MouseEvent):void
    
for(var t:DisplayObject e.target as DisplayObject;tt.parent){
        if(
== dropList) return;    //clicked inside
    
}
    
hideDropList();
    
this.stage.removeEventListener(MouseEvent.CLICKonClick);

dropList musst du natürlich mit dem Namen deiner Referenz ersetzen
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (26-10-2011 um 09:39 Uhr)
thomas_E ist gerade online   Mit Zitat antworten
Alt 26-10-2011, 09:50   #14 (permalink)
Neuer User
 
Registriert seit: Dec 2005
Ort: Oldenburg
Beiträge: 2.408
Genau das habe ich gesucht und nun gefunden - danke! :-)
__________________
Mein Blog
Freue mich über jeden Besucher. :)
Nico B. ist gerade online   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
on (release) { emoone Flash Einsteiger 6 02-08-2006 10:00
2 Aktionen mit on release() Superbohne Flash MX 7 29-01-2005 19:35
on Release... Strolchi03 ActionScript 1 2 14-11-2003 16:18
MC on release? damaskus Flash MX 17 17-10-2002 13:56
on release?? AmadeusK Flash MX 5 27-08-2002 10:08


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele