如何在Piccolo2D中精细控制可拾取性

  • 本文关键字:控制 Piccolo2D java piccolo
  • 更新时间 :
  • 英文 :


在下面的代码中,绘制了两个圆,并将其添加到一个分组节点中。

观察到以下行为变体:

1) 能够拖动圆的任何一点,包括外部和内部;如果通过圆间点拖动,则不会发生拖动

2) 只能通过外部拖动

3) 无法拖动

4) 能够在扩展边界中拖动任意点

任何行为都由subinitialize()参数发起。

我想知道,是否可以微调节点的活动"pickeble"点?例如,我可以让子节点不可选择,但让整个组只能由外部的圆圈拖动吗,就像在情况(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());
                }
            }
        };
    }
}

Suzan,

看看Piccolo如何管理输入事件,最明智的做法是为每个节点组创建一个特定的事件处理程序。piccolo只为您提供PNode级别的通用输入处理程序。这将使所有PNode事件实际上相同。如果你想为每个节点(或组)定义不同的行为,你需要派生一个类(例如从PNode或PPath),并添加逻辑来检测点击了哪个节点组,并根据subInitialize中传递的设置进行拖动。

Java的伟大之处在于,您可以轻松地扩展像Piccolo这样的库,以满足您自己的目的。

相关内容

  • 没有找到相关文章

最新更新