• 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;

 

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

 

 

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

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


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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Равиль Зарипов (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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу