Перейти к содержанию
Fire Monkey от А до Я
  • 0

Жесты: zoom: in + out


rakhmet

Вопрос

Вопрос: как определить, какое именно действие совершает пользователь - увеличивает или уменьшает?

zoomgesture.jpg

 

 

Ответ: на примере сэмпла, поставляемого в комплекте с Delphi, в файле C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\InteractiveGestures\ImageZoom\ImageZoomU.pas можно попробовать заменить одну часть процедуры:

      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;

на другую:

      begin
        { zoom the image }
        if EventInfo.Distance > FLastDistance then
        showmessage('zoom in') else showmessage('zoom out');
      end;

 

Что с этим делать дальше — думаю, объяснять излишне.

 

 

Если кто знает более элегантное решение, не основанное на вычислении дистанции, — смело делитесь, не стесняйтесь.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Я определяю так:

 

var
    FFirstDistance, FLastDistance: integer;
..

procedure TformMainMenu2.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
    case EventInfo.GestureID of
    igiZoom :
        begin
            if (not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags)) and
              (not(TInteractiveGestureFlag.gfEnd in EventInfo.Flags)) then
                FLastDistance := EventInfo.Distance;

            if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags) then
                FFirstDistance := EventInfo.Distance;

            if (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
            begin
                // zoom out
                if ( FFirstDistance > FLastDistance ) then
                begin
                    Plan.Scale := 0.5;
                end;

                // zoom in
                if ( FFirstDistance < FLastDistance ) then
                begin
                    Plan.Scale := 1.0;
                end;
            end;
        end;
    end;
end;
Изменено пользователем Barbanel
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...