我有这个 (现在工作) 代码,基于我在各个地方找到的位:
procedure TFormMain.imgMapsGesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
LObj: IControl;
LImage: TImage;
W: Single;
H: Single;
begin
LImage := nil;
LObj := Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));
if (LObj is TImage) and (LObj.Visible) then
begin
LImage := TImage(LObj.GetObject);
if (LImage <> imgMaps) then
LImage := nil
;
end
;
if LImage = nil then
Exit
;
if LImage.Bitmap = nil then
Exit
;
case EventInfo.GestureID of
igiZoom:
begin
if (EventInfo.Distance < 1) then
Exit
;
if
(not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags))
and
(not(TInteractiveGestureFlag.gfEnd in EventInfo.Flags))
then
begin
W := LImage.Width + 2 * ((EventInfo.Distance - FLastDistanceZoom) / 3);
H := LImage.Height + 2 * ((EventInfo.Distance - FLastDistanceZoom) / 3);
if
(W < layoutMapsContent.Width)
or
(H < layoutMapsContent.Height)
then
begin
W := layoutMapsContent.Width;
H := layoutMapsContent.Height;
end
;
LImage.Width := W;
LImage.Height := H;
FLastDistanceZoom := EventInfo.Distance;
end
;
end
;
igiPan:
begin
if
(not(TInteractiveGestureFlag.gfEnd in EventInfo.Flags))
then
begin
if (not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags)) then
begin
LImage.Position.X := LImage.Position.X + (EventInfo.Location.X - FMapsLastPositionPan.X);
LImage.Position.Y := LImage.Position.Y + (EventInfo.Location.Y - FMapsLastPositionPan.Y);
end
;
FMapsLastPositionPan.X := EventInfo.Location.X;
FMapsLastPositionPan.Y := EventInfo.Location.Y;
end
;
end
;
我的缩放工作得很好(虽然不是在模拟器中,而是在 iOS iPhone 上),但是平移根本不起作用。在模拟器中平移时,我可以看到 eventdisance 始终为 0。我在 TImage 上启用了平移 + 缩放功能。
我怀疑你在不同地方找到的代码是否真的有效:
documentation on TGestureInfo明确指出
[...] Distance is only set for the zoom and two finger tap gestures (TInteractiveGesture = igZoom or igTwoFingerTap). [...]
这意味着您必须跟踪在上一次调用 onGesture
时手指注册的位置。然后,您可以针对当时的 EventInfo.Location
和现在的 EventInfo.Location
的区别做一些事情。当然,这只有在 gfBegin
不在 GestureEvent.Flags
中时才有效,因为您不会有先前位置的有效值,但您已经知道了。
此外,您可能会查看 EventInfo.InertiaVector
以了解“当您抬起手指时,物体会继续移动一段时间”。但这完全是可选的。
此外,如果您正在处理手势(无论是交互式手势还是标准手势),您应该将 Handled
设置为 True
。这样,您就不会冒另一个组件尝试处理该手势的风险。但老实说,我不确定 FireMonkey 是否也是这种情况。使用 Vcl,它是。比较 FMX.Types.TInteractiveGestures 的文档与 Vcl.Controls.TInteractiveGestureOption .安全总比后悔好。
关于ios - Delphi iOS 和平移手势 - 距离始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17907730/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |