• 0
rakhmet

Жесты: zoom: in + out

Вопрос

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

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;

 

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

 

 

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

Равиль Зарипов (ZuBy), Rusland и sinuke понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 ответ на этот вопрос

  • 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
rakhmet и Евгений Корепов понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Равиль Зарипов (ZuBy)
      Давно не хватало TListView в горизонтальной ориентации, например чтобы сделать вот такую картинку

       
      zairkz сделал стиль с применением 9-patch png "технологии"
       
      С помощью жестов показано как сделать "сквозной скрол"
      как писал dreamix
       
       
      P.S. по компоненту TListViewHorz, не успел все протестить как следует со всеми параметрами
      не правильно будет отображаться Header'ы и Поиск, основной функционал сохранен
      UPDATE:  LVStyledhorz.7z
    • Автор: Алекс
      Добрый день!
      Однажды на форуме обсуждалась тема как сделать переключение вкладок TabControl  с анимацией через TActionList.
      Сейчас возникла необходимость переключать вкладки через жест pan? т.е. чтобы вкладка двигалась за пальцем пользователя (как это сделано практически во всех мобильных приложениях, например в фейсбуке. Ниже скрин, на котором показаны по половине обе вкладки, они в этот момент перетаскиваются пальцем).
      Это реально сделать? Если да, то как? Я уже подозреваю, что табом такого не сделаешь, а только широкой панелью, разделенное на сектора.

    • Автор: umkes
      Есть ли возможность при использовании MapView и при наличии нескольких маркеров на нем, посчитать оптимальный Location и Zoom mapview'a? Чтобы поместилось как можно больше маркеров.
      Вроде как на javascript это делается с помощью такого кода:
      var latlngbounds = new google.maps.LatLngBounds(); for (var i = 0; i < markerslat.length; i++) { latlngbounds.extend(markerslat[i]); } map.fitBounds(latlngbounds); Использование WebBrouser не подходит.
      Может у кого-то есть что сказать по этому поводу?
    • Автор: estra
      Помогите рабочим примером масштабирования компонентов (меня интересует TImage) пальцами. Я так понимаю надо включить опцию Touch -> InteractiveGesture -> Zoom, и обрабатывать событие OnGesture. А вот дальше у меня беда, в EventInfo есть координата только одного пальца, и как корректно масштабировать компонент я не понимаю... Помогите примером, пожалуйста
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу