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;

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