1

以下のコードでは、2 つの円が描画され、1 つのグループ化ノードに追加されます。

以下の動作バリアントが観察されました。

1) 外側と内側を含む円の任意の点でドラッグできます。交点でドラッグすると、ドラッグは発生しません

2) 外装のみでドラッグ可能

3) ドラッグできない

4) 拡張境界内の任意の点でドラッグ可能

すべての動作はsubinitialize()params によって開始されます。

ノードのアクティブな「ピッケブル」ポイントを微調整することは可能ですか? たとえば、(2) の場合のように、サブノードを選択不可のままにして、グループ全体を円の外部のみでドラッグできるようにすることはできますか?

Piccolo では、クリックが行われたグループ オブジェクトを特定できないため、必要です。特に、リスナーがアタッチされたグループノードを特定できないため、単一のリスナーを複数のノードにアタッチすると、どのノードが呼び出されたかを区別できなくなります。

public class Try_Picking_01 {

    private static final Logger log = LoggerFactory.getLogger(Try_Picking_01.class);

    public static void main(String[] args) {
        new PFrame() {

            final PNode group = new PNode();

            @Override
            public void initialize() {



                group.addInputEventListener(new PBasicInputEventHandler() {
                    @Override
                    public void mouseDragged(PInputEvent event) {

                        PDimension dim = event.getDeltaRelativeTo(group.getParent());
                        group.offset(dim.getWidth(), dim.getHeight());

                    }
                });

                getCanvas().getLayer().addChild(group);
                getCanvas().setPanEventHandler(null);

                // able to drag by any point of circle, including exterior and interior
                // if drag by intercircle point, drag does not occur
                // subinitialize(false, true, false);

                // able to drag only by exterior
                //subinitialize(true, true, false);

                // unable to drag
                // subinitialize(true, false, false);

                // able to drag by any point in extended bounds
                subinitialize(true, false, true);



            }

            private void subinitialize(boolean emptyFill, boolean pickable, boolean expandBounds) {

                PPath path1 = PPath.createEllipse(100, 100, 100, 100);
                path1.setStrokePaint(Color.RED);
                path1.setPaint( emptyFill ? null : Color.YELLOW ); // line #1
                log.info("path1.bounds = {}", path1.getBounds());
                path1.setPickable(pickable); // line #2

                PPath path2 = PPath.createEllipse(200, 200, 100, 100);
                path2.setPaint( emptyFill ? null : Color.YELLOW ); // line #3
                log.info("path2.bounds = {}", path2.getBounds());
                path2.setPickable(pickable); // line #4

                group.addChild(path1);
                group.addChild(path2);
                log.info("group.bounds = {}", group.getBounds());

                if( expandBounds ) {
                    group.setBounds(group.getFullBounds()); // line #5
                    log.info("group.bounds = {}", group.getBounds());
                }

            }
        };
    }
}
4

1 に答える 1

2

スーザン、

Piccolo が入力イベントを管理する方法を見ると、最も賢明なことは、ノード グループごとに特定のイベント ハンドラーを作成することです。piccolo は、PNode レベルでの汎用入力ハンドラーのみを提供します。これにより、すべての PNode イベントが実質的に同じになります。ノード (またはグループ) ごとに異なる動作を定義する場合は、クラスを派生させ (たとえば、PNode または PPath から)、どのノード グループがクリックされたかを検出するロジックを追加し、subInitialize で渡された設定に従ってドラッグする必要があります。

Java の優れた点は、Piccolo のようなライブラリを自分の目的に合わせて簡単に拡張できることです。

于 2013-12-29T19:55:36.370 に答える