2016-05-24 14 views
2

Ich habe einen horizontalen Stapel von Schaltflächen, die Registerkarten darstellen, und jede Schaltfläche hat eine TextField darin, die größer ist als die Abmessungen der Schaltfläche, so dass sie sich überlappen. Wie folgt aus (die gestrichelte Linie ist ein TextField und die roten Feld ist der Bereich, in dem sich mousing über nicht funktionieren aufgrund der Überlappung):Wie behandeln Sie mouseover-Ereignisse mit überlappenden TextFields?

enter image description here

Jede dieser Tasten ist eine Instanz eines TabButton, welches eine Klassendefinition wie folgt aus:

package src 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.text.TextField; 

    public class TabButton extends MovieClip 
    { 
     // Stage Instances 
     public var mcHitZone:MovieClip; 
     public var mcText:TextField; 

     public function TabButton() 
     { 
      super(); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true); 
     } 

     private function onAddedToStage(e:Event):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

      // Disable mouse input on everything except for the hit zone since that's where mouse handling should be done. 
      mcText.mouseEnabled = false; 

      mcHitZone.addEventListener(MouseEvent.ROLL_OVER, onMouse, false, 0, true); 
     } 

     private function onMouse(e:MouseEvent):void 
     { 
      trace("Mouse event: " + name + " " + e.type); 
     } 
    } 
} 

Jeder TabButton hat ein mcHitZone, dass ich die Maus-Handler bin Befestigung, die die schwarze Fläche auf dem obigen Bild ist. Da die TextField viel größer als die Schaltfläche selbst ist, muss sie für die Mauseingabe vollständig ignoriert werden. Daher deaktiviere ich sie mit mcText.mouseEnabled = false;, was funktioniert, wenn man innerhalb einer einzelnen Taste mausert, aber wenn man über den Überlappungsbereich fährt (die rote Box) die TextField wird Mauseingabe von der anderen Taste blockieren.

Gibt es eine Möglichkeit, dies funktioniert so, dass die TextField Mauseingabe auf nichts, mit dem es überlappt blockiert?

Ich habe die FLA und AS hochgeladen, die ich mit here getestet habe. Wenn Sie es ausführen, wird es nachverfolgen, wenn Sie eine bestimmte Schaltfläche durchlaufen. Wenn Sie versuchen, mit der Maus über den roten Bereich der Schaltfläche ganz links zu fahren, funktioniert das nicht.

+0

Die Frage ist: Warum überlappt Ihr Textfeld? Wenn Sie diesen Leerraum nicht benötigen, entfernen Sie ihn einfach und das Problem verschwindet! – akmozo

+0

Ich habe leider keine Wahl. Ich kann nicht ins Detail gehen, aber das Textfeld muss einfach so sein. Dies ist ein stark vereinfachtes Beispiel für die tatsächlichen Bibliotheken, die ich verwende. – Shenjoku

Antwort

1

Ihre Schaltfläche hat drei MovieClips, McHitZone, McText und TabButton selbst. Wenn Sie also zwei Schaltflächen schließen, wirkt sich die obere Tab-Taste (nicht Child-mcText) auf die untere Tab-Schaltfläche aus.

Ich rate, dass Ihr TabButton MovieClip nicht erweitert, verwenden Sie einfach die mcHitZone als Button Skin, dann fügen Sie es zu Ihrer Bühne.

Genau wie der Kommentar sagt, können Sie auch die Maus des TabButtons auf false setzen. Ich habe mouseEnabled und mouseChildren gemischt.

+0

oh! Das stimmt, der TabButton wird auf die Größe des größten untergeordneten Clips skaliert, was der mcText wäre, oder? Wenn TabButton nicht von MovieClip ausgeht, wo würde ich die mcHitZone und mcText hinzufügen? Sie müssen Kinder von etwas sein. – Shenjoku

+0

Ja. Sie können sie zu etwas hinzufügen, dem Sie Ihren TabButton hinzugefügt haben. – suzuiyue

+0

OK, ich denke ich verstehe. Ich werde ein bisschen experimentieren. Vielen Dank. – Shenjoku