На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Поддержка жестов в TMapScreen и TMapView

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Поддержка жестов в TMapScreen и TMapView
 
Здравствуйте!
Скажите, пожалуйста, поддерживают ли компоненты TMapScreen и TMapView мультитачевые жесты.
Если нет, то может быть подскажете, как лучше реализовать igiZoom и igiRotate.
В разработке используем Rad Studio XE3 Gis ToolKit 11.9.0.
 
Нет. Компоненты TMapScreen и TMapView не поддерживают напрямую такие действия пользователя как мультитачевый зум или поворт экрана.
Возможно, в перспективе добавим.
Пока это можно сделать самостоятельно, используя свойство ViewScale (управление масштабом отображения) и метод TurnSetup (установка угла поворота карты).

Пример того, как отследить эти события: http://docwiki.embarcadero.com/CodeExamples/XE3/en/FMXInteractiveGestures_(Delphi) (см. handleRotate и handleZoom)

Для масштабирования алгоритм такой:
1. выключить Rendering в компоненте;
2. рассчитать коэффициент изменения масштаба (по TGestureEventInfo.Distance);
3. запомнить центр карты (GetCenter);
4. изменить масштаб на рассчитанное значение (ViewScale);
5. восстановить центр карты (SetCenter);
6. включить Rendering и сделать перерисовку карты.
(пункты 3-4-5 можно заменить на масшабирование с помощью ScaleInPoint)

Для поворота алгоритм такой:
1. выключить Rendering в компоненте;
2. запомнить центр карты (GetCenter);
3. повернуть карту методом TurnSetup в соответсвии со значением TGestureEventInfo.Angle, с учетом текущего поворота карты (свойство TurnAngle);
5. восстановить центр карты (SetCenter);
6. включить Rendering и сделать перерисовку карты.

GetCenter и SetCenter в обоих слуаях обязательно делать не в пискелах, а в метрах (или в радианах, если карта поддерживает геодезическую СК).

PS
Пока до Вас никто всерьёз этим не озадачивался. Поэтому живыми примерами порадовать не можем.
Если Вы достигните положительного результата в этом вопросе, просьба тут выложить примерчик. Так сказать, в назидание потомкам...
 
Спасибо!
Буду пробовать, если что получится - выложу.
 
Вот сделал небольшой примерчик. Dropbox.

В связи с этим возник вопрос. На планшете довольно тормозной процессор и во время масштабирования и поворота видно как карта перерисовывается по кускам. И чем больший кусок карты попадает на экран, тем медленнее все отображается.
Скажите, пожалуйста, может можно каким либо образом на время этой обработки отключать часть слоев на карте? Уменьшить, так сказать детализацию карты.
 
При работе ГИС Карта 2011 на планшетах с Windows 8 управление пальцами поддерживается без дополнительного программирования за счет того, что операции пальцами автоматически отправляют сообщения, как от колесика мышки.
Операции масштабирования и листания карты выполняются в полном объеме.
 
Цитата
Oleg Belenkov пишет:
При работе ГИС Карта 2011 на планшетах с Windows 8 управление пальцами поддерживается без дополнительного программирования за счет того, что операции пальцами автоматически отправляют сообщения, как от колесика мышки.

Операции масштабирования и листания карты выполняются в полном объеме.

Только что сделал самую простую программку с одним TMapScreen на форме и проверил ее на планшете. Поддерживается только перемещение с помощью пальцев, масштабирование не работает. Планшет Samsung 500T c полноценной Win 8.
 
Значит нужно добавить еще некоторые комбинации работы с колесом мышки.
Как вариант (из ГИС Карта 2011):

Код
#define WHEEL_DELTA   120

// Включение опции масштабирования колесом мышки
int WheelScale = 0;

//---------------------------------------------------------------------------
// Крутится колесико мышки
//---------------------------------------------------------------------------
void __fastcall TMDIChild::FormMouseWheel(TObject *Sender,
      TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled)
{
  int delta = max(48, abs(WheelDelta * 32/WHEEL_DELTA));

  if ((WheelScale == 0) &&11/04/07
      ((::GetKeyState(VK_CONTROL) & 0xFFF8000) == 0))      // 24/06/06
    {
      // Перемещение карты
      if (WheelDelta < 0)
        {
          if (Shift.Contains(ssShift))
            HorzScrollBar->Position += (delta * 2);
          else
           VertScrollBar->Position += delta;
        }
      else
        {
          if (Shift.Contains(ssShift))
            HorzScrollBar->Position -= (delta * 2);
          else
            VertScrollBar->Position -= delta;
        }

      // Уведомить об изменении позиции мышки           // 30/07/10
      POINT pos;
      GetCursorPos(&pos);

      MapWindowLink.OnMove(ShiftStateToKeys(Shift), pos);
    }
  else
    {
      // Масштабирование
      if (WheelDelta > 0)                          // 25/07/06
        {
          // Посылка символов > и < для пошагового масштабирования (но можно и плавно масштабировать...)
          MapWindowLink.OnKeyDown(190, 0, 0);
        }
      else
        {
          MapWindowLink.OnKeyDown(188, 0, 0);
        }
    }

  Handled = true;
}
 
Что-то в вашем примере я никак не разберусь. :(

Что такое MapWindowLink, куда мы посылаем эти символы?
И еще, я правильно понял, что если я сделаю зуммирование на событие  Ctrl+MouseWheel, тогда это будет на планшете работать как жест для зума?
 
На MapWindowLink не обращайте внимания (это куски текста из другой программы). Имелось ввиду, что Windows8 превращает движение двумя пальцами в комбинацию MouseWheel + CTRL
 
Добрый день в 15 версии появилась ли поддержка мультижестов ?  
Страницы: 1 2 След.
Читают тему (гостей: 4)



© КБ Панорама, 1991-2026

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности