我在带有触摸屏的Windows PC的Delphi FMX中实现了简单的绘画应用程序。
我正在寻找一个在屏幕上第一次触摸后直接调用的函数,并在完成触摸后调用类似的函数。非常接近 MouseDown 和 MouseUp 并使用 TControl.Pressed 。
我尝试使用鼠标功能但不幸的是,许多Windows触摸屏在触摸屏幕后都没有发送此事件(其中一些是这样做的)。
我还尝试了点按功能,但只有在屏幕上没有拖动手指时才会调用它。
最后,我想使用 TGestureManager ,但似乎只关注缩放,旋转等手势。
还有其他选择来实现我的目标吗?
答案 0 :(得分:2)
使用手势管理器并捕获平移手势(从对象检查器中的交互式手势部分选择它)。然后,您可以获得有关手势,检测方向和速度的所有详细信息。用户开始用手指轻扫后立即平移手势返回数据。
以下是我的代码中的示例:
procedure TfrmMain.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo;
var Handled: Boolean);
var
lTouchDirection: TTouchDirection;
procedure GestureBegin;
begin
fGestureHandled := false;
fSlideStartPos := EventInfo.Location;
end;
procedure GestureContinue;
var
dX, dY: Single;
begin
if fGestureHandled then exit;
dX := EventInfo.Location.X - fSlideStartPos.X;
dY := EventInfo.Location.Y - fSlideStartPos.Y;
if (Abs(dX) < 1) and (Abs(dY) < 1) then Exit;
if lTouchDirection = TTouchDirection.tdNone then
begin
if Abs(dX) > Abs(dY) then
begin // horizontal
if dX > 0 then
lTouchDirection := TTouchDirection.tdRight
else
lTouchDirection := TTouchDirection.tdLeft;
end
else // vertical
begin
if dY > 0 then
lTouchDirection := TTouchDirection.tdDown
else
lTouchDirection := TTouchDirection.tdUp;
end;
end;
end;
procedure GestureEnd;
begin
fGestureHandled := false;
end;
begin
Handled := true;
if Touch.InteractiveGestures = [] then exit;
lTouchDirection := TTouchDirection.tdNone;
if EventInfo.Flags = [TInteractiveGestureFlag.gfBegin] then
GestureBegin;
if EventInfo.Flags = [] then
GestureContinue;
if EventInfo.Flags = [TInteractiveGestureFlag.gfEnd] then
GestureEnd;
end;
答案 1 :(得分:0)
事实证明 MouseDown 事件已发送,但即使您正在触摸屏幕,FMX中TControl的按下属性也会返回false。 Pressed属性只读取鼠标按钮。通过 MouseDown 和 MouseUp 实施 myPressed 属性后,即使您触摸屏幕然后取消触摸,myPressed也会返回true。