Merge pull request #3219 from mempool/mononaut/momentum-scrolling
blockchain momentum scrolling
This commit is contained in:
commit
0c8636c803
@ -38,6 +38,9 @@ export class StartComponent implements OnInit, OnDestroy {
|
|||||||
pageIndex: number = 0;
|
pageIndex: number = 0;
|
||||||
pages: any[] = [];
|
pages: any[] = [];
|
||||||
pendingMark: number | void = null;
|
pendingMark: number | void = null;
|
||||||
|
lastUpdate: number = 0;
|
||||||
|
lastMouseX: number;
|
||||||
|
velocity: number = 0;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private stateService: StateService,
|
private stateService: StateService,
|
||||||
@ -136,6 +139,7 @@ export class StartComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
onMouseDown(event: MouseEvent) {
|
onMouseDown(event: MouseEvent) {
|
||||||
this.mouseDragStartX = event.clientX;
|
this.mouseDragStartX = event.clientX;
|
||||||
|
this.resetMomentum(event.clientX);
|
||||||
this.blockchainScrollLeftInit = this.blockchainContainer.nativeElement.scrollLeft;
|
this.blockchainScrollLeftInit = this.blockchainContainer.nativeElement.scrollLeft;
|
||||||
}
|
}
|
||||||
onPointerDown(event: PointerEvent) {
|
onPointerDown(event: PointerEvent) {
|
||||||
@ -159,6 +163,7 @@ export class StartComponent implements OnInit, OnDestroy {
|
|||||||
@HostListener('document:mousemove', ['$event'])
|
@HostListener('document:mousemove', ['$event'])
|
||||||
onMouseMove(event: MouseEvent): void {
|
onMouseMove(event: MouseEvent): void {
|
||||||
if (this.mouseDragStartX != null) {
|
if (this.mouseDragStartX != null) {
|
||||||
|
this.updateVelocity(event.clientX);
|
||||||
this.stateService.setBlockScrollingInProgress(true);
|
this.stateService.setBlockScrollingInProgress(true);
|
||||||
this.blockchainContainer.nativeElement.scrollLeft =
|
this.blockchainContainer.nativeElement.scrollLeft =
|
||||||
this.blockchainScrollLeftInit + this.mouseDragStartX - event.clientX;
|
this.blockchainScrollLeftInit + this.mouseDragStartX - event.clientX;
|
||||||
@ -167,7 +172,7 @@ export class StartComponent implements OnInit, OnDestroy {
|
|||||||
@HostListener('document:mouseup', [])
|
@HostListener('document:mouseup', [])
|
||||||
onMouseUp() {
|
onMouseUp() {
|
||||||
this.mouseDragStartX = null;
|
this.mouseDragStartX = null;
|
||||||
this.stateService.setBlockScrollingInProgress(false);
|
this.animateMomentum();
|
||||||
}
|
}
|
||||||
@HostListener('document:pointermove', ['$event'])
|
@HostListener('document:pointermove', ['$event'])
|
||||||
onPointerMove(event: PointerEvent): void {
|
onPointerMove(event: PointerEvent): void {
|
||||||
@ -183,6 +188,45 @@ export class StartComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resetMomentum(x: number) {
|
||||||
|
this.lastUpdate = performance.now();
|
||||||
|
this.lastMouseX = x;
|
||||||
|
this.velocity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateVelocity(x: number) {
|
||||||
|
const now = performance.now();
|
||||||
|
let dt = now - this.lastUpdate;
|
||||||
|
if (dt > 0) {
|
||||||
|
this.lastUpdate = now;
|
||||||
|
const velocity = (x - this.lastMouseX) / dt;
|
||||||
|
this.velocity = (0.8 * this.velocity) + (0.2 * velocity);
|
||||||
|
this.lastMouseX = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
animateMomentum() {
|
||||||
|
this.lastUpdate = performance.now();
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
const now = performance.now();
|
||||||
|
const dt = now - this.lastUpdate;
|
||||||
|
this.lastUpdate = now;
|
||||||
|
if (Math.abs(this.velocity) < 0.005) {
|
||||||
|
this.stateService.setBlockScrollingInProgress(false);
|
||||||
|
} else {
|
||||||
|
const deceleration = Math.max(0.0025, 0.001 * this.velocity * this.velocity) * (this.velocity > 0 ? -1 : 1);
|
||||||
|
const displacement = (this.velocity * dt) - (0.5 * (deceleration * dt * dt));
|
||||||
|
const dv = (deceleration * dt);
|
||||||
|
if ((this.velocity < 0 && dv + this.velocity > 0) || (this.velocity > 0 && dv + this.velocity < 0)) {
|
||||||
|
this.velocity = 0;
|
||||||
|
} else {
|
||||||
|
this.velocity += dv;
|
||||||
|
}
|
||||||
|
this.blockchainContainer.nativeElement.scrollLeft -= displacement;
|
||||||
|
this.animateMomentum();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
onScroll(e) {
|
onScroll(e) {
|
||||||
const middlePage = this.pageIndex === 0 ? this.pages[0] : this.pages[1];
|
const middlePage = this.pageIndex === 0 ? this.pages[0] : this.pages[1];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user