代号一 - 长按事件忽略普通按下

Codename one - Long Press Event to Ignore normal Press

我一直在按照本指南进行操作,并在演示的最后提供了工作示例(非常有见地的教程,10/10 会推荐):

https://codenameone.teachable.com/courses/java-for-mobile-devices-introducing-codename-one/lectures/2647773

现在我想通过添加一个浮动操作按钮来添加新项目,将其扩展为更实用的待办事项列表,例如:

fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT,
Component.BOTTOM);
fab.addActionListener(e -> { // show dialog for adding new item });

这本身就可以正常工作。现在是棘手的部分。在任何项目上使用长按事件时,应该发生两件事:

  1. 长按项目的视觉效果应该改变以指示它正在被选中(不是复选框或切换按钮 "select" 而是突出显示。
  2. FAB 应更改其图标和动作侦听器以删除突出显示的项目。

长按事件是通过覆盖 Checkbox 的 longPointPress 方法实现的 class:

@Override
public void longPointerPress(int x, int y){
     mainForm.longPressEvent(this);
    // no event parameter for e.consume();
}

我的问题:

Q1:当我使用 ToggleButton 的动作侦听器时,"normal" 单击事件和长按事件都被触发。我需要区分两者。 longPointerPress 方法在参数列表中没有事件,因此在完成长按事件 activity 后我无法使用该事件。我怎样才能防止触发正常的动作侦听器?

Q2:对于 "highlight effect",我希望该项目的所有边都有边距,整体缩小该元素。换句话说,没有增加以前的总大小。不过,只需添加边距,项目就会变大。 如何将给定元素缩小到所有边,但保持原始大小?

Q3:FAB只有"setIcon"的选项,没有"setMaterialIcon"的选项。因此,我目前正在每次更改时重新创建 FAB,因为我不想忙于涉及的样式。还有比这更好的方法吗?

//this is the unwanted function, as I dont want to set the style myself
fab.setIcon(FontImage.createMaterial(icon, s));

//Delete FAB pressed, change to Add FAB
fab.remove();
fab = FloatingActionButton.createFAB(FontImage.MATERIAL_ADD);
fab.bindFabToContainer(current.getContentPane(), Component.RIGHT, Component.BOTTOM);

Action 事件总是在指针释放时调用,无论是否触发了长按事件,因为我们没有"know"您处理了 longPress 事件。您需要创建一个标志,例如:

private boolean handledInLongPress;

public void longPress(int x, int y) {
   // do your stuff
   handledInLongPress = true;
}


private void handleActionEvent(ActionEvent ev) {
    // I'm using this as a placeholder for your event code
    // block the event from propagating and undo anything it might
    // have triggered
    ev.consume();
}

我建议在元素上使用 setUIID() 并定义一组 "delete*" UIID。您可以定义较小的填充和字体来创建缩小效果,但如果您在此处也有图标,这可能会很棘手。您可以缩小上述图标并保留原始图标以在客户端中恢复 属性.

FAB 做了很多假设,因此重新创建它(或使用两个实例)可能比尝试设置图标更好。在当前实现中无法在运行时更改 FAB 的图标。