如何使用手势识别缩放方向(输入/输出)并应用缩放效果?

时间:2012-06-11 19:57:47

标签: delphi winapi windows-7 delphi-xe2 gesture

使用Delphi XE 2我试图识别缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且在Image的OnGesture事件中的EventInfo属性没有此信息

我已经看到使用Direct2d进行放大和缩小的样本,但它直接使用wp_touch消息来执行此操作,并使用直接2d的变换矩阵比例函数执行缩放效果但我不想使用direct2d对于这个项目,因为它只有基于触摸的放大和缩小效果,其他的是简单的点击。

有可能识别存储第一个方向的输入/输出并与当前方向进行比较,因为EventInfo参数具有属性Direction但我认为这不是很好的方法,或者我错了吗? / p>

那之后是否有关于如何在TImage中执行缩放效果的任何推荐或示例?我已经做到了,但是在缩放时不会平息每个应用程序的效果。

2 个答案:

答案 0 :(得分:2)

在阅读了一些文件后,我发现正确的方法是:

拦截EventInfo.GestureID以在我的情况下识别所需的命令zoom命令,之后你应该读取EventInfo.Flags并识别它是否是gfBegin所以你可以缓存第一个位置点(x,y)和第一个距离,当标志不同时,gfBegin使用firstpoint和currentpoint(EventInfo.Location)执行计算

基本命令应该是这样的:

 case EventInfo.GestureID of
  igiZoom:
   begin
     if (EventInfo.Flags = [gfBegin]) then
      begin
        FLastDistance := EventInfo.Distance;
        FFirstPoint.X := EventInfo.Location.X;
        FFirstPoint.Y := EventInfo.Location.Y;
        FFirstPoint := ScreenToClient(FFirstPoint);

        if (FSecondPoint.X = 0) and (FSecondPoint.Y = 0) then
         begin
          FSecondPoint.X := EventInfo.Location.X + 10;
          FSecondPoint.Y := EventInfo.Location.Y + 10;
          FSecondPoint := ScreenToClient(FSecondPoint);
         end;
        //ZoomCenter is a local TPoint var 
        ZoomCenter.Create(((FFirstPoint.X + FSecondPoint.X) div 2),
                          ((FFirstPoint.Y + FSecondPoint.Y) div 2));
        //Apply the zoom to the object  
        FDrawingObject.Zoom(EventInfo.Distance / FLastDistance, ZoomCenter.X, ZoomCenter.Y);

        Invalidate;
      end
       else
         begin
            FSecondPoint.X := EventInfo.Location.X;
            FSecondPoint.Y := EventInfo.Location.Y;
            FSecondPoint := ScreenToClient(FSecondPoint);

            ZoomCenter.Create(((FFirstPoint.X + FSecondPoint.X) div 2),
                              ((FFirstPoint.Y + FSecondPoint.Y) div 2));

            FDrawingObject.Zoom(EventInfo.Distance / FLastDistance, ZoomCenter.X, ZoomCenter.Y);

            Invalidate;
            //Update with the new values for next interaction
            FFirstPoint := FSecondPoint;
            FLastDistance := EventInfo.Distance;
         end;

Windows v7.0 SDK中提供了一个用c#编写的示例代码,可以作为参考使用,帮助我做一些操作。

答案 1 :(得分:0)

对于最近发布的Delphi,EventInfo有一个Distance属性。我们不必计算它。

对于缩放等交互式手势,请查看docwiki中的示例代码: http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMXInteractiveGestures_(Delphi)

    procedure TForm36.handleZoom(EventInfo: TGestureEventInfo);
var
  LObj: IControl;
  image: TImage;
begin
  LObj := Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));
  if LObj is TImage then
  begin
    if not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags) then
    begin
      image := TImage(LObj.GetObject);
      image.Width := image.Width + (EventInfo.Distance - FLastDIstance)/2;
      image.Height := image.Height + (EventInfo.Distance - FLastDIstance)/2;
      image.Position.X := image.Position.X - (EventInfo.Distance - FLastDIstance)/2;
      image.Position.Y := image.Position.Y - (EventInfo.Distance - FLastDIstance)/2;
    end;
  end;
  FLastDIstance := EventInfo.Distance;
end;