在下面的代码中,绘制了两个圆圈,并将其添加到一个分组节点。
观察到以下行为变体:
1)可以拖动任何圆圈,包括外部和内部;如果通过交点拖动,则不会发生拖动
2)只能在外部拖动
3)无法拖动
4)可以在扩展范围内任意拖动
任何行为均由subinitialize()
参数启动。
我想知道,是否有可能微调节点的活动“易变”点?例如,是否可以让子节点不处于可拾取状态,而是使整个组只能由圆形外部拖动(如情况(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());
}
}
};
}
}
最佳答案
苏赞
查看Piccolo如何管理输入事件,最明智的做法是为每个节点组创建一个特定的事件处理程序。短笛仅在PNode级别为您提供通用输入处理程序。这实际上使所有PNode事件都相同。如果要为每个节点(或组)定义不同的行为,则需要派生一个类(例如,来自PNode或PPath),并添加逻辑以检测单击了哪个节点组并根据subInitialize中传递的设置进行拖动。
Java的伟大之处在于,您可以轻松扩展Piccolo之类的库以适合您自己的目的。
关于java - 如何在Piccolo2D中精细控制可拾取性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20477952/