-
-
Save vazad28/bd7ff445b090ab130ff1b291ca057002 to your computer and use it in GitHub Desktop.
<ion-header no-shadow> | |
<ion-navbar no-border-bottom> | |
<ion-buttons start> | |
<button ion-button color="light" (click)="closeModal()">Cancel</button> | |
</ion-buttons> | |
<ion-title>Media</ion-title> | |
<ion-buttons end> | |
<ion-spinner *ngIf="!mediaLoaded" color="light"></ion-spinner> | |
</ion-buttons> | |
</ion-navbar> | |
</ion-header> | |
<ion-content> | |
<div #imageParent class="pinch-zoom-container"> | |
<img #image dimg="medium" class="pinch-zoom-image" [src]="src" alt="loading.." (load)="setMediaLoaded()"> | |
</div> | |
</ion-content> |
.scroll-content { | |
background: #1e1e1e; | |
} | |
ion-navbar .toolbar-background { | |
background: rgba(0,0,0,0.3); | |
} | |
ion-content .scroll-content { | |
margin-top:0px !important; | |
} | |
.pinch-zoom-container { | |
position:relative; | |
overflow: hidden; | |
height: 100%; | |
width:100%; | |
} | |
.pinch-zoom-image { | |
position: absolute; | |
top: 50%; /* position the top edge of the element at the middle of the parent */ | |
left: 50%; /* position the left edge of the element at the middle of the parent */ | |
transform: translate(-50%, -50%); /* This is a shorthand of | |
translateX(-50%) and translateY(-50%) */ | |
width: 100%; | |
} |
import { Component, ViewChild } from '@angular/core'; | |
import { Platform, NavController, NavParams, ViewController } from 'ionic-angular'; | |
import { Gesture } from 'ionic-angular' | |
@Component({ | |
selector: 'page-image-zoom', | |
templateUrl: 'image-zoom.html' | |
}) | |
export class ImageZoom { | |
@ViewChild('image') element; | |
@ViewChild('imageParent') elementParent; | |
image = null; | |
container = null; | |
transforms = []; | |
adjustScale = 1; | |
adjustDeltaX = 0; | |
adjustDeltaY = 0; | |
currentScale = null; | |
currentDeltaX = null; | |
currentDeltaY = null; | |
public media: any; | |
public src: string; | |
public mediaType: string; | |
private gesture: Gesture; | |
public mediaLoaded:boolean = false; | |
constructor( | |
public platform: Platform, | |
public navCtrl: NavController, | |
public viewCtrl: ViewController | |
) { | |
this.media = this.navParams.get("media"); | |
this.src = this.appGlobals.mediaBaseUrls.medium + this.media.id + '.jpg'; | |
console.log("src", this.src); | |
} | |
setMediaLoaded =() =>{ | |
setTimeout(()=>this.mediaLoaded = true, 200); | |
} | |
ionViewDidLoad() { | |
this.image = this.element.nativeElement; | |
this.container = this.elementParent.nativeElement; | |
// Prevent long press saving on mobiles. | |
this.container.addEventListener('touchstart', function(e) { | |
e.preventDefault(); | |
}); | |
this.init(); | |
} | |
/* | |
Initialize listeners for gestures | |
*/ | |
init = () => { | |
//create gesture obj w/ ref to DOM element | |
this.gesture = new Gesture(this.element.nativeElement); | |
//listen for the gesture | |
this.gesture.listen(); | |
this.gesture.on('doubletap', (ev) => { | |
this.transforms = []; | |
this.adjustScale += 1; | |
if (this.adjustScale >= 4) this.adjustScale = 1; | |
this.transforms.push('scale(' + this.adjustScale + ')'); | |
this.container.style.transform = this.transforms.join(' '); | |
}); | |
this.gesture.on("pinch", (ev) => { | |
this.transforms = []; | |
// Adjusting the current pinch/pan event properties using the previous ones set when they finished touching | |
this.currentScale = this.adjustScale * ev.scale; | |
this.currentDeltaX = this.adjustDeltaX + (ev.deltaX / this.currentScale); | |
this.currentDeltaY = this.adjustDeltaY + (ev.deltaY / this.currentScale); | |
// Concatinating and applying parameters. | |
if (this.currentScale < 1) { | |
this.currentScale = 1; | |
this.currentDeltaX = 0; | |
this.currentDeltaY = 0; | |
} | |
this.transforms.push('scale(' + this.currentScale + ')'); | |
this.transforms.push('translate(' + this.currentDeltaX + 'px,' + this.currentDeltaY + 'px)'); | |
this.container.style.transform = this.transforms.join(' '); | |
}); | |
this.gesture.on("pinchend", (ev) => { | |
// Saving the final transforms for adjustment next time the user interacts. | |
this.adjustScale = this.currentScale; | |
this.adjustDeltaX = this.currentDeltaX; | |
this.adjustDeltaY = this.currentDeltaY; | |
}); | |
this.gesture.on("panend", (ev) => { | |
// Saving the final transforms for adjustment next time the user interacts. | |
this.adjustScale = this.currentScale; | |
this.adjustDeltaX = this.currentDeltaX; | |
this.adjustDeltaY = this.currentDeltaY; | |
}); | |
} | |
/* close modal */ | |
closeModal() { | |
this.viewCtrl.dismiss(); | |
} | |
} |
@jcalvezar you just copy paste this code inside the "init" function:
this.gesture.on("pan", (ev) => {
this.transforms = [];
// Adjusting the current pinch/pan event properties using the previous ones set when they finished touching
this.currentScale = this.adjustScale * ev.scale;
this.currentDeltaX = this.adjustDeltaX + (ev.deltaX / this.currentScale);
this.currentDeltaY = this.adjustDeltaY + (ev.deltaY / this.currentScale);
if (this.currentScale < 1) {
this.currentScale = 1;
this.currentDeltaX = 0;
this.currentDeltaY = 0;
}
this.transforms.push('scale(' + this.currentScale + ')');
this.transforms.push('translate(' + this.currentDeltaX + 'px,' + this.currentDeltaY + 'px)');
this.container.style.transform = this.transforms.join(' ');
});
Guess @vazad28 forgot to add this one, it work the same as the function for pinch.
Hello, first, I would like to thank you for sharing this code.
I have a question. Doesn't this work with an Ngfor img src? Background: I want to open a base64 from my database and then mark a location via touch (XY coordinates).
I get this error when entering to the Page "can not get native element of undefined" If i click ok I still get the picture displayed, but have no access to the gestures.
I would be really grateful for help!
<ion-header>
<ion-navbar>
<ion-title text-center>
</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
> >
> > <div #imageParent class="pinch-zoom-container
> >
> > <ion-card #canvas *ngFor="let maps of this.mangel.maps2; let i=index">
> > <img #image dimg="medium" class="pinch-zoom-image" src="data:image/jpg;base64,{{maps.base64}}" *ngIf="maps.base64" />
> > </ion-card>
> >
> > </div> "
>
</ion-content>
import { NavParams} from 'ionic-angular';
import { Component, ViewChild, ElementRef, Renderer } from '@angular/core';
import { NavController, Gesture, Content,Platform,ViewController} from 'ionic-angular';
import { ScreenOrientation } from '../../../node_modules/@ionic-native/screen-orientation';
@Component({
selector: 'page-openplan',
templateUrl: 'openplan.html',
})
export class OpenplanPage {
map_id;
private _CANVAS : any;
private _CONTEXT : any;
canvasElement:any;
image = null;
container = null;
transforms = [];
adjustScale = 1;
adjustDeltaX = 0;
adjustDeltaY = 0;
currentScale = null;
currentDeltaX = null;
currentDeltaY = null;
public media: any;
public mediaType: string;
public src: string;
private gesture: Gesture;
public mediaLoaded:boolean = false;
@ViewChild('image') element;
@ViewChild('imageParent') elementParent;
constructor(
public navCtrl: NavController,
public navParams: NavParams,
private screenOrient: ScreenOrientation,
private renderer: Renderer,
private mangel: MangelProvider,
private platform: Platform,
private viewCtrl: ViewController,
)
{
this.map_id = this.navParams.get("map_id")
}
ionViewDidLoad() {
this.image = this.element.nativeElement;
this.container = this.elementParent.nativeElement;
// Prevent long press saving on mobiles.
this.container.addEventListener('touchstart', function(e) {
e.preventDefault();
});
this.init();
this.screenOrient.lock(this.screenOrient.ORIENTATIONS.LANDSCAPE)
this.mangel.getMaps2(this.map_id)
}
ionViewWillEnter() {
this.screenOrient.lock(this.screenOrient.ORIENTATIONS.LANDSCAPE)
this.mangel.getMaps2(this.map_id)
}
init = () => {
//create gesture obj w/ ref to DOM element
this.gesture = new Gesture(this.element.nativeElement);
//listen for the gesture
this.gesture.listen();
this.gesture.on("pan", (ev) => {
this.transforms = [];
// Adjusting the current pinch/pan event properties using the previous ones set when they finished touching
this.currentScale = this.adjustScale * ev.scale;
this.currentDeltaX = this.adjustDeltaX + (ev.deltaX / this.currentScale);
this.currentDeltaY = this.adjustDeltaY + (ev.deltaY / this.currentScale);
if (this.currentScale < 1) {
this.currentScale = 1;
this.currentDeltaX = 0;
this.currentDeltaY = 0;
}
this.transforms.push('scale(' + this.currentScale + ')');
this.transforms.push('translate(' + this.currentDeltaX + 'px,' + this.currentDeltaY + 'px)');
this.container.style.transform = this.transforms.join(' ');
});
this.gesture.on('doubletap', (ev) => {
this.transforms = [];
this.adjustScale += 1;
if (this.adjustScale >= 4) this.adjustScale = 1;
this.transforms.push('scale(' + this.adjustScale + ')');
this.container.style.transform = this.transforms.join(' ');
});
this.gesture.on("pinch", (ev) => {
this.transforms = [];
// Adjusting the current pinch/pan event properties using the previous ones set when they finished touching
this.currentScale = this.adjustScale * ev.scale;
this.currentDeltaX = this.adjustDeltaX + (ev.deltaX / this.currentScale);
this.currentDeltaY = this.adjustDeltaY + (ev.deltaY / this.currentScale);
// Concatinating and applying parameters.
if (this.currentScale < 1) {
this.currentScale = 1;
this.currentDeltaX = 0;
this.currentDeltaY = 0;
}
this.transforms.push('scale(' + this.currentScale + ')');
this.transforms.push('translate(' + this.currentDeltaX + 'px,' + this.currentDeltaY + 'px)');
this.container.style.transform = this.transforms.join(' ');
});
this.gesture.on("pinchend", (ev) => {
// Saving the final transforms for adjustment next time the user interacts.
this.adjustScale = this.currentScale;
this.adjustDeltaX = this.currentDeltaX;
this.adjustDeltaY = this.currentDeltaY;
});
this.gesture.on("panend", (ev) => {
// Saving the final transforms for adjustment next time the user interacts.
this.adjustScale = this.currentScale;
this.adjustDeltaX = this.currentDeltaX;
this.adjustDeltaY = this.currentDeltaY;
});
}
/* close modal */
closeModal() {
this.viewCtrl.dismiss();
}
}
Can someone please elaborate on the appGlobals from the code in the constructor, I am getting an error for it.
Hi @vazad28 ,
Thanks for the code, im using it, its very good :)
Hrafven is right, navParms should be injected.
And I cant move the image using just one finger, I have to use two to zoom/shring and to move.
Can you modify it to let one move the image using just one finger please?
Thanks !