LoginSignup
0
0

More than 3 years have passed since last update.

mapbox-gl-js でも Google Map と同じように2本指でタッチ操作するようにしたい

Posted at

スクロールズーム(scrollZoom)とドラッグ移動(dragPan)を無効にするパラメーターを
コンストラクタにオプションとして渡すと、マウス操作やタッチ操作で地図を動かせなくなる

https://docs.mapbox.com/mapbox-gl-js/api/map/#map-parameters
https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/

const map = new mapbox.Map({
  container: 'map',
  scrollZoom: false,
  dragPan: false,
  accessToken: 'YOUR ACCESS TOKEN'
})

このままだと、地図移動が出来なくなるので Google Map と同じように2本指でタッチ操作できるようにするためにイベントハンドラを設定する

TouchEvent にアクセスするために originalEvent を使い touches.length で指の本数を判定
タッチ操作開始時に dragPan を有効化し、タッチ操作終了時に無効化する

https://docs.mapbox.com/mapbox-gl-js/api/events/#maptouchevent#originalevent
https://developer.mozilla.org/ja/docs/Web/API/TouchEvent/touches

map.on('touchstart', (ev) => {
  if (ev.originalEvent.touches.length === 2) {
    map.dragPan.enable()
  }
})
map.on('touchend', () => {
  if (map.dragPan.isEnabled()) map.dragPan.disable()
})

PC向けに特定キー(CmdやCtrl)を押している場合にマウス操作できるようにするためにイベントハンドラを設定する
※ Windows 環境で未検証

map.on('mousedown', (ev) => {
  if (ev.originalEvent.metaKey || ev.originalEvent.ctrlKey) {
    map.dragPan.enable()
  }
})
map.on('mouseup', () => {
  if (map.dragPan.isEnabled()) map.dragPan.disable()
})

mouseleavemouseout も設定しないといけない気がする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0