Android OnMouseDown和OnMouseUp只能成对工作吗?

Android OnMouseDown和OnMouseUp只能成对工作吗?,android,delphi,delphi-xe5,onmousedown,onmouseup,Android,Delphi,Delphi Xe5,Onmousedown,Onmouseup,我的应用程序有很多树角作为键盘的键。当一个被点击时,你会听到一个声音。这是通过处理OnMouseDown和OnMouseUp事件来完成的。OnMouseDown:发送声音,onmousedup:关闭。除了一件事之外,一切都很好 在Android上,我可以用几个手指按下几个键。当处理了一个OnMouseDown时,在处理OnMouseUp事件之前,不会处理其他OnMouseDown事件。它不必是阻止另一个OnMouseDown的键的OnMouseUp,它可以是任何OnMouseUp事件。示例代码:

我的应用程序有很多树角作为键盘的键。当一个被点击时,你会听到一个声音。这是通过处理OnMouseDown和OnMouseUp事件来完成的。OnMouseDown:发送声音,onmousedup:关闭。除了一件事之外,一切都很好

在Android上,我可以用几个手指按下几个键。当处理了一个OnMouseDown时,在处理OnMouseUp事件之前,不会处理其他OnMouseDown事件。它不必是阻止另一个OnMouseDown的键的OnMouseUp,它可以是任何OnMouseUp事件。示例代码:

procedure TKeyBoard.note_down (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
   key: TKey;
begin
   key := Sender as TKey;
   logd ('Entering OnMouseDown event handler: %d', [key.Note]);
   PutShort ($90, key.Note, 127);
   logd ('Exiting OnMouseDown event handler: %d', [key.Note]);
end; // note_down //

procedure TKeyBoard.note_up (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
   key: TKey;
begin
   key := Sender as TKey;
   logd ('Entering OnMouseUp event handler: %d', [key.Note]);
   PutShort ($80, Key.Note, 127);
   logd ('Exiting OnMouseUp event handler: %d', [key.Note]);
end; // note_up //
...
Rectangle [i].OnMouseDown := note_down;
Rectangle [i].OnMouseUp   := note_up;

其中,根据调试代码立即输入和退出note_down和note_up例程。假设在处理OnMouseDown时,在处理OnMouseDown之前不能处理OnMouseDown是正确的吗?如果是这样,是否有解决办法?

根据逻辑,
MouseDown
事件后面必须跟一个
MouseUp
事件(配对)。这是鼠标实际操作的方式

按下鼠标按钮(这意味着它变为“向下”)。在释放并返回“向上”状态之前,无法再次按下该按钮。(没有“鼠标部分向下”、“鼠标再向下一点”、“鼠标再向下一点”状态;鼠标按钮是按下(“向下”)或未按下(“向上”)

唯一合理的顺序是
MouseDown
,然后是相应的(成对的)
MouseUp
。两条消息的
Sender
可能不是同一个控件-可以在一个控件上按下鼠标,在按住按钮的同时移动鼠标,然后在另一个控件上释放鼠标(甚至在应用程序本身之外)-但顺序必须是“向下,然后向上”

这里有一个快速的方法来演示这种行为和逻辑

  • 创建新的VCL表单应用程序(或FMX应用程序-在以下步骤中将
    TShape
    替换为
    TMemo
    ,或将任何其他控件替换为
    OnMouseDown
    OnMouseUp
    事件)
  • 在表单左侧放置一个
    t形状
  • t标签
    放在该
    t形状的右侧
  • 单击
    t形状
    ,切换到对象检查器中的事件选项卡,并为
    Shape1.OnMouseDown
    Shape1.onmousedup
    事件添加以下事件处理程序:

    procedure TForm1.Shape1MouseDown(Sender: TObject);
    begin
      Label1.Caption := 'Mouse down';
      Label1.Update;
    end;
    
    procedure TForm1.Shape1MouseUp(Sender: TObject);
    begin
      Label1.Caption := 'Mouse up';
      Label1.Update;
    end;
    
    运行应用程序。将鼠标放在
    Shape1
    上并按下按钮。注意标签的文本,它显示“鼠标向下”。释放它,标签的标题将更改为“鼠标向上”


    在形状上按下鼠标按钮,将标签标题设置为“鼠标向下”,然后将鼠标移动到不同的位置并松开按钮,观察标签变为“鼠标向上”每次释放按钮时,不管鼠标指针的位置如何。

    给OnMouseEnter一个mobile的快照。我正在做一个有很多矩形的项目,在我的代码中我有

    {$ifdef MSWINDOWS}
    lRect.OnClick := ClickEvent;
    {$else}
    lRect.OnMouseEnter := ClickEvent;
    {$endif}
    

    这让我可以将手指拖过一个矩形网格,并让它为我经过的每个矩形调用我的ClickEvent。

    我的实验得出了相同的结论。这就是为什么我对解决方法感兴趣。有没有办法检测出几次鼠标下降,然后几次鼠标上升?据我所知,没有办法,因为正如我解释的那样但是,这在物理上是不可能的。如果鼠标不能从现有的鼠标内部物理上生成第二个鼠标向下移动(因为按钮不能在没有先向上移动的情况下物理上向下移动),它就不能生成无序事件。(根据您实际需要的行为,您可能可以使用其他事件,但这不是您在这里要问的问题。您的问题特别是“OnMouseDown和OnMouseUp仅作为一对工作吗?”,这是我回答的问题。:-)嗯,有一句话是关于变通方法;-)无论如何,谢谢你的透彻解释。关于鼠标,你是对的。重点是,在Android平板电脑上,点击会产生鼠标点击,同时可以使用多个手指,在没有OnMouseUp的情况下可以生成多个onmousedown。跨平台不是那么容易:-)我会在当天晚些时候尝试。在举起手指时使用OnMouseExit?它似乎解决了一个潜在的问题:如何检测快速移动过按键的手指。我认为OnMouseExit会很好地工作,但我自己没有使用过。我后来考虑过这一点,意识到它不能解决多点触摸问题。你可以看到好的,这可能会对你的多点触摸有所帮助。我会在Android的所有功能恢复正常后立即尝试:-(如果多点触摸支持不起作用,我会尝试你的链接(顺便说一句,链接不错)。非常感谢你的建议!如果这两个选项中的任何一个有效,我会接受你的答案(可能需要一些时间)。使用OnMouseCenter和OnMouseLeave有与OnMouseUp/Down相同的问题。它有一个优点,我可以快速移动手指沿所有键:-)您提供的链接是多点触摸的好方法。非常感谢,现在我可以在我的MIDI键盘上弹奏和弦;-)以防有人使用我之前为iOS发布的链接: