4

Delphi XE 2を使用して、ズーム効果を画像(TImage)に適用するためにズーム方向を特定しようとしましたが、それを実行する関数が見つかりませんでした。また、画像のOnGestureイベントのEventInfoプロパティにこの情報がありませんでした。

Direct2dを使用してズームインおよびズームアウトするサンプルをたくさん見てきましたが、wp_touchメッセージを直接使用してズーム効果を実行し、direct 2dからの変換行列スケール関数を使用していますが、このプロジェクトにdirect2dを使用したくありませんこのズームインとズームアウトの効果はタッチに基づいているだけなので、他のことは単純なクリックです。

EventInfoパラメーターにはDirectionプロパティがあるため、最初の方向を格納して現在の方向と比較するin / outを識別することは可能かもしれませんが、これがそれを行うための良い方法だとは思わないか、間違っていますか?

その後、TImageでズーム効果を実行する方法に関する推奨事項や例はありますか?私はすでにそれを行っていますが、すべてのアプリケーションが行うピンチ効果を与えるためにズームするときにパンしません。

4

2 に答える 2

2

たくさんのドキュメントを読んだ後、正しい方法は次のとおりであることがわかりました。

EventInfo.GestureIDをインターセプトして、私の場合はズームコマンドで必要なコマンドを識別します。その後、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#で記述されたサンプルコードがあります。これは参照として使用でき、多くのことを助けてくれます。

于 2012-06-13T22:26:13.887 に答える
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;
于 2017-12-14T14:38:34.877 に答える