首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Piccolo2D中精细控制可拾取性?

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

Stack Overflow用户
提问于 2013-12-10 02:30:48
回答 1查看 208关注 0票数 1

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

观察到以下行为变体:

1)可以拖动任何圆点,包括外部和内部;如果拖动圆内点,则不发生拖动

2)只能通过外部拖动

3)无法拖动

4)能够拖动扩展边界中的任何点

任何行为都是由subinitialize()参数初始化的。

我想知道,有没有可能微调一个节点的活动“可拾取点”?例如,我是否可以保留不可拾取的子节点,但使整个组只能由圆形外部拖动,就像在情况(2)中一样?

这是必需的,因为Piccolo不允许确定点击是在哪个组对象中进行的。特别是,我不能确定侦听器所附加到的组节点,所以如果我有一个侦听器并将其附加到多个节点,我将无法区分哪个是被调用的。

代码语言:javascript
复制
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());
                }

            }
        };
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-12-30 03:55:36

苏珊

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

Java的伟大之处在于你可以很容易地扩展像Piccolo这样的库来满足你自己的目的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20477952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档