为什么第一个pointerDragged位置取决于表单的大小?

时间:2019-06-03 10:28:10

标签: codenameone

我注意到拖动Switch实例之类的行为有些奇怪。为了对此进行研究,我创建了一个小型的不可滚动Form派生对象,其中包含一个带有自定义绘制方法的Component派生对象,该方法绘制了一个组件大小的圆角矩形,并为pointerPressed位置绘制了绿色十字线,为第一个pointerDragged位置绘制了蓝色十字线。 / p>

将模拟器与Desktop Skin一起使用进行测试时,将获得类似于在自定义组件中拖动的视图:

enter image description here enter image description here enter image description here

因此,似乎第一个获得的dreddragged位置离pointerPressed位置越远,窗体就越大。

无论何时需要pointerDragged事件,这都是一个问题。例如,在使用Switch组件的情况下,这在横向iPad上非常明显。

那是为什么?是错误还是功能?

代码如下:

    Form hi = new Form("Hi World", BoxLayout.y());
    hi.setScrollable(false);
    Command commandReload = new Command("Reload") {
        @Override
        public void actionPerformed(ActionEvent aActionEvent) {
            start();
        }
    };
    hi.getToolbar().addCommandToRightBar(commandReload);
    Component component = new Component() {
        Point pointPressed = null, pointDraggedFirst = null;

        @Override
        protected Dimension calcPreferredSize() {
            return new Dimension(120, 120);
        }
        @Override
        public void paint(Graphics aGraphics) {
            aGraphics.setColor(0x000000);
            aGraphics.drawRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, 20, 20);
            if (null != pointPressed) {
                aGraphics.setColor(0x00C000);
                aGraphics.drawLine(getX(), pointPressed.getY() - getAbsoluteY(), getX() + getWidth() - 1, pointPressed.getY() - getAbsoluteY());
                aGraphics.drawLine(pointPressed.getX() - getAbsoluteX(), getY(), pointPressed.getX() - getAbsoluteX(), getY() + getHeight() - 1);
                if (null != pointDraggedFirst) {
                    aGraphics.setColor(0x0000ff);
                    aGraphics.drawLine(getX(), pointDraggedFirst.getY() - getAbsoluteY(), getX() + getWidth() - 1, pointDraggedFirst.getY() - getAbsoluteY());
                    aGraphics.drawLine(pointDraggedFirst.getX() - getAbsoluteX(), getY(), pointDraggedFirst.getX() - getAbsoluteX(), getY() + getHeight() - 1);
                }
            }
        }
        @Override
        public void pointerPressed(int x, int y) {
            pointPressed = new Point(x, y);
        }
        @Override
        public void pointerDragged(int x, int y) {
            if (null == pointDraggedFirst) {
                pointDraggedFirst = new Point(x, y);
            }
        }
        @Override
        public void pointerReleased(int x, int y) {
            pointPressed = null;
            pointDraggedFirst = null;
        }
    };
    hi.add(FlowLayout.encloseLeftMiddle(component));
    hi.add(new Label("X") {
        int width = 0, height = 0;
        @Override
        public void paint(Graphics aGraphics) {
            if (width != hi.getWidth() || height != hi.getHeight()) {
                width = hi.getWidth();
                height = hi.getHeight();
                Display.getInstance().callSerially(() -> setText("Form Width/Height: " + hi.getWidth() + "/" + hi.getHeight()));
            }
            super.paint(aGraphics);
        }
    });
    hi.show();

1 个答案:

答案 0 :(得分:1)

某些设备会立即发送拖动的指针并创建难以区分单击和拖动的效果。因此,我们有一个由屏幕百分比和事件计数组成的阈值,在此期间我们阻止了本地拖动事件。

您可以通过覆盖getDragRegionStatus来表明您对特定拖动事件的兴趣,从而缩短时间。