FAQ FM
Компоненты\Image

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

[iOS, Android] Как масштабировать изображение пальцами?

// Способ первый
// Изменяя размеры компонента
var
  FLastDistance: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Image1.Touch.InteractiveGestures := [TInteractiveGesture.Zoom];
end;

procedure TForm1.Image1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  LObj: IControl;
  LImage: TImage;
  LImageCenter: TPointF;
begin
   if EventInfo.GestureID = igiZoom then
   begin
      LObj := Self.ObjectAtPoint( ClientToScreen( EventInfo.Location ) );
      if LObj is TImage then
      begin
         if ( not( TInteractiveGestureFlag.gfBegin in EventInfo.Flags ) ) and
            ( not( TInteractiveGestureFlag.gfEnd in EventInfo.Flags ) ) then
         begin
            { zoom the image }
            LImage := TImage( LObj.GetObject );
            LImageCenter := LImage.Position.Point + PointF( LImage.Width / 2,
                                                            LImage.Height / 2 );
            LImage.Width := LImage.Width + ( EventInfo.Distance - FLastDistance );
            LImage.Height := LImage.Height + ( EventInfo.Distance - FLastDistance );
            LImage.Position.X := LImageCenter.X - LImage.Width / 2;
            LImage.Position.Y := LImageCenter.Y - LImage.Height / 2;
         end;
         FLastDistance := EventInfo.Distance;
      end;
   end;
end;

// Способ второй
// Изменяя коэффициент масштабирования
var
  FLastDistance: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Image1.Touch.InteractiveGestures := [TInteractiveGesture.Zoom];
end;

procedure TForm1.Image1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  LObj: IControl;
  LImage: TImage;
  LImageCenter: TPointF;
  ScaleFactorX, ScaleFactorY: Single;
begin
   if EventInfo.GestureID = igiZoom then
   begin
      LObj := Self.ObjectAtPoint( ClientToScreen( EventInfo.Location ) );
      if LObj is TImage then
      begin
         if ( not( TInteractiveGestureFlag.gfBegin in EventInfo.Flags ) ) and
            ( not( TInteractiveGestureFlag.gfEnd in EventInfo.Flags ) ) then
         begin
            { zoom the image }
            LImage := TImage( LObj.GetObject );
            LImageCenter := LImage.Position.Point + PointF( ( LImage.Width * LImage.Scale.X ) / 2,
                                                            ( LImage.Height * LImage.Scale.Y ) / 2 );

            ScaleFactorX := LImage.Scale.X + ( ( EventInfo.Distance - FLastDistance ) / 300 );
            ScaleFactorY := LImage.Scale.Y + ( ( EventInfo.Distance - FLastDistance ) / 300 );

            LImage.Scale.X := ScaleFactorX;
            LImage.Scale.Y := ScaleFactorY;
            LImage.Position.X := LImageCenter.X - ( LImage.Width * ScaleFactorX ) / 2;
            LImage.Position.Y := LImageCenter.Y - ( LImage.Height * ScaleFactorY ) / 2;
         end;
         FLastDistance := EventInfo.Distance;
      end;
   end;
end;

При использовании материала - ссылка на сайт обязательна