2

デザインの問題に直面しているプロジェクトのようなグラフィックボードを構築しています。

メイン クラスは Board で、形状を描画するときにマウス イベントを処理するキャンバスです。また、グリッド磁気を有効にする currentShape や snapFlag などのコンテキスト変数もあります。

形状の移動/サイズ変更/回転を処理するために、ObjectHandles (flex) と呼ばれるサードパーティのオープン ソース ツールを継承します。

onMove 関数などの内部関数の一部をオーバーライドするために、ObjectHandles メイン クラスを拡張する baseShape があります。

シェイプを作成するとき (マウス ダウン、移動、マウス アップ)、これはボードによって処理され、ボード自身のスナップ フラグを認識します。

var mouseUpPoint:Point = boardCanvas.globalToLocal(new Point(event.stageX, event.stageY)); var snapMouseUpPoint = snapPoint(mouseUpPoint.x, mouseUpPoint.y);

私のオーバーライドされた onMove メソッドでは、形状が Board snap フラグとその変化を認識できるようにしたいと考えています。これを行うにはどうすればよいですか?

snap をチェックできるように、basicShape コンストラクターのパラメーターとして Board を渡しますか?

フラグをパラメーターとして渡し、何らかの方法ですべての形状が変更をリッスンするようにしますか?

最もクリーンなソリューションは何ですか?

どうもありがとう。

4

7 に答える 7

1

少し違う角度からこれにアプローチします。Boardどの図形がクリックされたかを判断できるように、オブジェクトは最初にマウス イベントをトラップすると仮定します。シェイプ オブジェクトに認識させるのではなく、正しい (スナップまたはスナップ解除された) 座標を選択したShapeオブジェクトに渡すことで、ボードにマウスの動きをトラップさせることもできます。

これにより、グリッド スナップの処理は に任せられ、BoardオブジェクトShapeメソッドonMoveが乱雑にならないようになります。

于 2008-11-24T21:56:38.353 に答える
1

アプリがわからない場合:

シェイプが独自の「スナップ」動作を持つことは可能ですか? つまり、シェイプをスナップから除外し、他のシェイプを除外することはできますか? その場合、snapFlag を Shape のメンバーにします。ボードに snapFlag が設定されている場合は、シェイプを反復処理し、ルールに従って設定または設定しないようにします。

スナップ動作がボード上のすべてのシェイプに適用される場合は、イベント駆動型モデルを検討してください (利用可能な場合 - 私は Flex 初心者です)。Shape が移動すると、OnMove イベントを発生させます。その後、理事会は対応し、適切であればシェイプを所定の位置に「スナップ」することを決定できます。

スナップ動作がすべての形状に適用され、イベントが利用できない場合、この場合は疎結合で地獄を言うだけです-形状をボード対応にします。ObjectHandle を使用して一連のコードを保存しているようです。そのメリットは、UI 要素を結合するコストを上回る可能性があります。

于 2008-11-24T22:26:45.123 に答える
0

このように解決しました:

baseShape クラスで onMouseMove をオーバーライドし、PureMVC フレームワークを使用しているため、baseShape に boardMediator を認識させました。

保護された関数 onMouseMove(event:MouseEvent) をオーバーライド: void { [...]

// added on override
var board:BoardMediator = ApplicationFacade.getInstance().retrieveMediator(BoardMediator.NAME) as BoardMediator;

それで

desiredPos = board.snapPoint(desiredPos.x, desiredPos.y);

o ボード ビューで globalToLocal メソッドをオーバーライドしても機能しましたが、onMouseMove 内でいくつかの計算が行われ、位置合わせされていないスナップ ムーブが発生しました。

于 2008-11-25T09:35:44.837 に答える
0

OnMouseMove オブジェクトハンドル

        protected function onMouseMove(event:MouseEvent) : void
    {
        if( ! visible ) { return; }

        if( ! event.buttonDown )
        {
            setMouseCursor( event.stageX, event.stageY );
            return;
        }

        if(parent == null )
        {
            return;
        }


        var dest:Point = parent.globalToLocal( new Point(event.stageX, event.stageY) );
        var desiredPos:Point = new Point();
        var desiredSize:Point = new Point();
        var desiredRotation:Number = 0; 

... plenty more
then 

            if( wasMoved ) {    dispatchMoving() ; }
            if( wasResized ) {  dispatchResizing() ; }
            if( wasRotated ) {  dispatchRotating(); }

そのため、形状がすでに自由に動いているため、移動イベントをリッスンしてボードにスナップするように指示することはできません。ここにスナップを追加する必要があります。

var dest:Point = parent.globalToLocal( new Point(event.stageX, event.stageY) );

すべての形状はスナップ ルールに従います。一方がスナップし、他方がフリーになることはありません。

于 2008-11-24T22:45:18.143 に答える
0

ObjectHandles バージョン 2 を使用してから、必要なことを行うための制約を作成します。

于 2010-03-19T17:14:05.327 に答える
0

あなたと一緒に考えようとしているだけです.IBoardインターフェースを持つShapeは大したことではないと思います。でも、ボード上のフラグをチェックしなければならないという考えは好きではありません...

フラグをパラメーターとしてどのように渡しますか? OnMove() メソッドで? これがよくわかりませんでした...拡大していただけますか?

とはいえ..SRPについて少し考えてみると、単一責任の原則...シェイプクラスの責任は何ですか? はい、これは eJames が既に書いたものです。

彼らの主な責任はおそらくマウスイベントの処理ではないように感じます...ここではあなたのアプリケーションについてもっと知る必要がありますが、私の一般的な気持ちは、他の誰かがこのマウスを下げて、形状がそれで何をすべきかを理解しない理由です.たとえば、新しい座標を使用して Shape で Draw() を呼び出しますか?

複合パターン (形状内の形状...) のようなものを適用し、それらのマウスイベントを自分で処理できるようにしたいとしましょう...しかし、ローカルでこのマウスイベントを認識した場合は論理的です。座標ですが、ボード上の「グローバル」変数を要求する必要がないように、このイベント (ローカル座標、マウスの状態など) を通じてすべての情報を提供する必要があると思います...

于 2008-11-24T21:59:44.727 に答える
0

シェイプ コンストラクターのパラメーターとしてフラグを渡します。しかし、フラグが変更されるため、変更時にフラグのコピーを更新するために各形状を作成する必要があるため、これは良くありません。

形状の責任は、マウスイベントの処理方法を知ることではありません。しかし、それは ObjectHandles が行うことです: イベントに反応し、形状の高さ、幅、回転パラメーターを更新します。

シェイプの選択と移動/サイズ変更/回転を処理するために、ボード クラスのライブラリ コードの一部を転送する必要があるかもしれません。

于 2008-11-24T22:13:12.297 に答える