我注意到拖动Switch实例之类的行为有些奇怪。为了对此进行研究,我创建了一个小型的不可滚动Form派生对象,其中包含一个带有自定义绘制方法的Component派生对象,该方法绘制了一个组件大小的圆角矩形,并为pointerPressed位置绘制了绿色十字线,为第一个pointerDragged位置绘制了蓝色十字线。 / p>
将模拟器与Desktop Skin一起使用进行测试时,将获得类似于在自定义组件中拖动的视图:
因此,似乎第一个获得的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();
答案 0 :(得分:1)
某些设备会立即发送拖动的指针并创建难以区分单击和拖动的效果。因此,我们有一个由屏幕百分比和事件计数组成的阈值,在此期间我们阻止了本地拖动事件。
您可以通过覆盖getDragRegionStatus
来表明您对特定拖动事件的兴趣,从而缩短时间。