mirror of https://gitee.com/antv-l7/antv-l7
146 lines
3.2 KiB
TypeScript
146 lines
3.2 KiB
TypeScript
|
// @ts-ignore
|
||
|
import { PointLayer, Scene, ILayer } from '@antv/l7';
|
||
|
import { GaodeMap, GaodeMapV2 } from '@antv/l7-maps';
|
||
|
import * as React from 'react';
|
||
|
import '../index.css';
|
||
|
import { animate, easeInOut } from 'popmotion';
|
||
|
|
||
|
const mapCenter = [121.107846, 30.267069] as [number, number];
|
||
|
|
||
|
export default class Slider extends React.Component {
|
||
|
// @ts-ignore
|
||
|
private scene: Scene;
|
||
|
public pointLayer: ILayer;
|
||
|
public isShow: boolean = false;
|
||
|
public slider: HTMLElement;
|
||
|
public sliderWidth: number;
|
||
|
public sliderRight: number = 20;
|
||
|
|
||
|
public componentWillUnmount() {
|
||
|
this.scene.destroy();
|
||
|
}
|
||
|
|
||
|
public async componentDidMount() {
|
||
|
this.slider = document.getElementById('sliderwrap') as HTMLElement;
|
||
|
|
||
|
this.sliderWidth = this.slider.getBoundingClientRect().width;
|
||
|
|
||
|
const scene = new Scene({
|
||
|
id: 'map',
|
||
|
map: new GaodeMapV2({
|
||
|
center: mapCenter,
|
||
|
pitch: 0,
|
||
|
style: 'normal',
|
||
|
zoom: 20,
|
||
|
animateEnable: false,
|
||
|
}),
|
||
|
});
|
||
|
|
||
|
this.pointLayer = new PointLayer()
|
||
|
.source(
|
||
|
[
|
||
|
{
|
||
|
lng: 121.107846,
|
||
|
lat: 30.267069,
|
||
|
},
|
||
|
{
|
||
|
lng: 121.107,
|
||
|
lat: 30.267069,
|
||
|
},
|
||
|
],
|
||
|
{
|
||
|
parser: {
|
||
|
type: 'json',
|
||
|
x: 'lng',
|
||
|
y: 'lat',
|
||
|
},
|
||
|
},
|
||
|
)
|
||
|
.shape('circle')
|
||
|
.color('blue')
|
||
|
.size(10);
|
||
|
scene.on('loaded', () => {
|
||
|
scene.addLayer(this.pointLayer);
|
||
|
|
||
|
scene.setCenter(mapCenter, {
|
||
|
padding: [0, this.sliderWidth + this.sliderRight, 0, 0],
|
||
|
});
|
||
|
|
||
|
scene.render();
|
||
|
});
|
||
|
|
||
|
this.scene = scene;
|
||
|
}
|
||
|
|
||
|
public triggle() {
|
||
|
const lastPaddingRight = this.sliderWidth + this.sliderRight;
|
||
|
this.isShow = !this.isShow;
|
||
|
if (this.slider) {
|
||
|
this.slider.style.right = this.isShow ? '20px' : `-${this.sliderWidth}px`;
|
||
|
this.sliderRight = this.isShow ? 20 : -this.sliderWidth;
|
||
|
|
||
|
const currentPaddingRight = this.sliderWidth + this.sliderRight;
|
||
|
|
||
|
animate({
|
||
|
from: {
|
||
|
v: lastPaddingRight,
|
||
|
},
|
||
|
to: {
|
||
|
v: currentPaddingRight,
|
||
|
},
|
||
|
ease: easeInOut,
|
||
|
duration: 500,
|
||
|
onUpdate: (o) => {
|
||
|
this.scene.setCenter(mapCenter, { padding: [0, o.v, 0, 0] });
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public render() {
|
||
|
return (
|
||
|
<>
|
||
|
<div
|
||
|
id="map"
|
||
|
style={{
|
||
|
position: 'absolute',
|
||
|
top: 0,
|
||
|
left: 0,
|
||
|
right: 0,
|
||
|
bottom: 0,
|
||
|
overflowX: 'hidden',
|
||
|
}}
|
||
|
/>
|
||
|
<div
|
||
|
id="sliderwrap"
|
||
|
style={{
|
||
|
position: 'absolute',
|
||
|
top: '50px',
|
||
|
right: `20px`,
|
||
|
bottom: '50px',
|
||
|
width: '350px',
|
||
|
border: '1px solid',
|
||
|
borderRadius: '10px',
|
||
|
background: '#fff',
|
||
|
transition: '0.5s',
|
||
|
}}
|
||
|
>
|
||
|
<div
|
||
|
style={{
|
||
|
position: 'absolute',
|
||
|
top: '50%',
|
||
|
left: '-50px',
|
||
|
height: '0px',
|
||
|
width: '0px',
|
||
|
cursor: 'pointer',
|
||
|
}}
|
||
|
onClick={() => this.triggle()}
|
||
|
>
|
||
|
{'<<'}
|
||
|
</div>
|
||
|
</div>
|
||
|
</>
|
||
|
);
|
||
|
}
|
||
|
}
|