Iは、インラインSVG画像でこれを試みたが、私はhammerjs(https://www.npmjs.com/package/hammerjs)と共にSVGパン - ズームライブラリ(https://www.npmjs.com/package/svg-pan-zoom)を使用します。 svg-pan-zoomライブラリは、HTMLオブジェクト内のSVGと組み込み要素でも機能することを示しています。
npmでプロジェクトにインストールし、コンポーネントにインポートして、svg-pan-zoomライブラリの指示に従って実装します。
HTML:
<ion-content>
<div class="zoom">
<svg id="svg" class="svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="width:100%;height:100%;">...</svg>
</div>
</ion-content>
CSS:
.zoom {
position: fixed;
width: 100%;
height: 100%;
}
コンポーネント:ライブラリの
import { Component } from '@angular/core';
import svgPanZoom from 'svg-pan-zoom';
import Hammer from 'hammerjs';
@Component({
selector: 'page-map',
templateUrl: 'map.html'
})
export class MapPage {
panZoom:any;
constructor(){ }
ngOnInit(){
let eventsHandler;
eventsHandler = {
haltEventListeners: ['touchstart', 'touchend', 'touchmove', 'touchleave', 'touchcancel'],
init: function(options) {
var instance = options.instance, initialScale = 1, pannedX = 0, pannedY = 0
// Init Hammer
// Listen only for pointer and touch events
this.hammer = Hammer(options.svgElement, {
inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput
})
// Enable pinch
this.hammer.get('pinch').set({enable: true})
// Handle double tap
this.hammer.on('doubletap', function(ev){
instance.zoomIn()
})
// Handle pan
this.hammer.on('panstart panmove', function(ev){
// On pan start reset panned variables
if (ev.type === 'panstart') {
pannedX = 0
pannedY = 0
}
// Pan only the difference
instance.panBy({x: ev.deltaX - pannedX, y: ev.deltaY - pannedY})
pannedX = ev.deltaX
pannedY = ev.deltaY
})
// Handle pinch
this.hammer.on('pinchstart pinchmove', function(ev){
// On pinch start remember initial zoom
if (ev.type === 'pinchstart') {
initialScale = instance.getZoom()
instance.zoom(initialScale * ev.scale)
}
instance.zoom(initialScale * ev.scale)
})
// Prevent moving the page on some devices when panning over SVG
options.svgElement.addEventListener('touchmove', (e) => { e.preventDefault(); });
},
destroy: function(){
this.hammer.destroy()
}
}
let options = {
controlIconsEnabled: false,
customEventsHandler: eventsHandler
};
this.panZoom = svgPanZoom('#svg', options);
}
おかげで、それは私が始める助けました。しかし、私は最終的に、より高度なズームアニメーションとパンが必要になることに気付きました。 Hammer.jsで試してみる – Logus