在 FMX 中,当用户在编辑框上按下时,许多场景下,是要拖动位置,但是,FMX.Controls 在 MouseDown 事件中,就调用了控件的 SetFocus ,结果就造成按下时,弹出输入法,影响拖动操作。我们可以将相应的代码那到 MouseUp 中来解决这一问题。同时,我们加一个判断,以避免将拖动识别为点击。
所以,我们要做的第一步是打开 FMX.Controls.pas,找到下面的这段代码:
procedure TControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if (not (csDesigning in ComponentState)) and (not FIsFocused) then SetFocus; if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); if FAutoCapture then Capture; if (ssDouble in Shift) then begin DblClick; FDoubleClick := True; end else if Button = TMouseButton.mbLeft then begin FPressed := True; FPressedPosition := TPointF.Create(X, Y); StartTriggerAnimation(Self, 'Pressed'); end; end;seButton.mbLeft then begin FPressed := True; FPressedPosition := TPointF.Create(X, Y); StartTriggerAnimation(Self, 'Pressed'); end; end;
将第一句删除,以避免它设置焦点,修正成下面这样:
procedure TControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); if FAutoCapture then Capture; if (ssDouble in Shift) then begin DblClick; FDoubleClick := True; end else if Button = TMouseButton.mbLeft then begin FPressed := True; FPressedPosition := TPointF.Create(X, Y); StartTriggerAnimation(Self, 'Pressed'); end; end;seButton.mbLeft then begin FPressed := True; FPressedPosition := TPointF.Create(X, Y); StartTriggerAnimation(Self, 'Pressed'); end; end;
然后,我们需要找到 TControl.MouseUp 的代码(原始):
procedure TControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin ReleaseCapture; if Assigned(FOnMouseUp) then FOnMouseUp(Self, Button, Shift, X, Y); if FPressed then begin FPressed := False; StartTriggerAnimation(Self, 'Pressed'); end; FDoubleClick := False; end;
我们要修改下它,以在用户松开时,将如果用户是点击在相应的按钮(移动距离小于10,这个阀值大家可以自己调节,一般为5-10),则设置焦点:
procedure TControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if (not (csDesigning in ComponentState)) and (not FIsFocused) and (FPressedPosition.Distance(PointF(X,Y))<10) then SetFocus; ReleaseCapture; if Assigned(FOnMouseUp) then FOnMouseUp(Self, Button, Shift, X, Y); if FPressed then begin FPressed := False; StartTriggerAnimation(Self, 'Pressed'); end; FDoubleClick := False; end;
好了,剩下的就是将修改后的源码复制到你工程的当前目录下,用来替换系统自带的FMX.Controls。
实际运行效果视频: