FLEX3, Click and catching catching, caso speciale
-
04-07-2019 - |
Domanda
Ecco il mio problema:
Ho una 'lavagna' di tela principale in un pannello, questa tela ha molti bambini, come una barra degli strumenti (tessere), un'etichetta e alcuni skinning.
Il problema è che quando passo allo strumento rettangolo e comincio a disegnare rettangoli se voglio cambiare lo strumento quando faccio clic su un altro strumento come "cerchio" o "seleziona" il pulsante non cattura il clic evento, invece la tela catturerà il mouse e inizierà a disegnare.
Proprio come nella foto, quindi non riesco a cambiare strumento una volta che inizio a disegnare.
alt text http://www.freeimagehosting.net/uploads/397a7cd49e.png
Come potrei non far reagire la tela quando è su uno strumento, o come posso fare in modo che il pulsante catturi prima il clic e dica alla tela di non disegnare nulla.
Naturalmente potrei semplicemente posizionare la barra degli strumenti da qualche altra parte non sulla tela, ma poiché lo spazio è importante vorrei che i pulsanti fossero sulla tela.
Sono aperto a qualsiasi suggerimento.
=== Ecco alcuni codici per mostrare come funziona internamente. ===
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:degrafa="http://www.degrafa.com/2007"
xmlns:comp="org.foo.bar.view.components.*"
layout="absolute"
title="Tableau">
<mx:Script>
<![CDATA[
import org.edorado.edoboard.ApplicationFacade;
]]>
</mx:Script>
<mx:Canvas id="blackBoard">
<degrafa:Surface id="boardSurfaceContainer">
skinning
</degrafa:Surface>
<!-- Tool bar -->
<comp:ToolbarView
id = "toolbar"
name = "toolbar"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
bottom="5"
right="5"
top="5"
direction="vertical"
width="30" />
<mx:Label x="10" y="10" text="Label" color="#FFFFFF" id="lbl"/>
</mx:Canvas>
</mx:Panel>
La barra degli strumenti è un elenco di pulsanti contenuti in un riquadro. La "lavagna" della tela è collegata alla gestione di numerosi eventi, in particolare il mouse verso l'alto e lo spostamento per disegnare le forme.
...
boardCanvas.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
boardCanvas.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
...
private function handleMouseDown(event:MouseEvent):void {
// Get the current mouse location wich may be adjusted to the grid
var selectPoint:Point = boardCanvas.globalToLocal(new Point(event.stageX, event.stageY));
startPoint = snapPoint(selectPoint.x, selectPoint.y);
boardView.lbl.text = '(' + startPoint.x +',' + startPoint.y + ')';
....
La barra degli strumenti ascolta anche i clic
<?xml version="1.0" encoding="utf-8"?>
<mx:Tile xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.charts.BubbleChart;
import org.edorado.edoboard.view.components.shapes.*;
public static const TOOL_CHANGE:String = "toolChange";
public static const TEXT_TOOL:String = "textTool";
public static const SELECT_TOOL:String = "selectTool";
public static const RECTANGLE_TOOL:String = "rectangleTool";
private var b:Button = null;
private function handleButtonClick(event:MouseEvent):void {
trace("CLICKED TOOL");
// selectButton.dispatchEvent(new Event(TOOL_CHANGE, true, true))
b = event.target as Button;
b.dispatchEvent(new Event(TOOL_CHANGE, true, true));
}
]]>
</mx:Script>
<!-- Use class facotry ? -->
<mx:Button id="selectButton"
name="{SELECT_TOOL}"
selectedUpSkin="assets.skins.ToolButtonSkin"
width="30"
height="30"
styleName="selectButton"
toolTip="selection"
click="handleButtonClick(event); " />
<mx:Button id="textButton"
name = "{TEXT_TOOL}"
selectedUpSkin="assets.skins.ToolButtonSkin"
width="30"
height="30"
styleName="textButton"
toolTip="text"
click="handleButtonClick(event);" />
<mx:Button id="rectButton"
name = "{RECTANGLE_TOOL}"
selectedUpSkin="assets.skins.ToolButtonSkin"
width="30"
height="30"
styleName="rectButton"
toolTip="rectButton"
click="handleButtonClick(event);" />
</mx:Tile>
Soluzione 2
Grazie, Ho trovato alcuni post simili in realtà ho appena ascoltato il mouse in basso nella mia barra degli strumenti e ho fermato la propagazione degli eventi in modo che la tela non la catturasse.
Altri suggerimenti
Puoi utilizzare il target proprietà del tuo MouseEvent per differenziare il comportamento quando il il clic proviene dalla barra degli strumenti. Basta prendere un bottino su LiveDocs per capire qual è la proprietà target.
Buona fortuna!