【发布时间】:2021-02-20 02:14:54
【问题描述】:
如何在没有反应的情况下启用 TripsLayer 的动画? TripsLayer 示例使用 React,我真的不知道如何将其转换为纯 js。请查看下面代码中的“动画”功能。我试图更新层的状态,但它不起作用(没有 TripsLayer 的动画)。我不知道,我应该在哪里分配“时间”变量。
TripsLayer 演示:https://deck.gl/#/examples/custom-layers/trip-routes
React 版本我的代码:https://github.com/uber/deck.gl/blob/master/examples/website/trips/app.js
TripsLayer 的文档:https://github.com/uber/deck.gl/tree/master/modules/experimental-layers/src/trips-layer
我的代码:
import {MapboxLayer} from '@deck.gl/mapbox';
import {TripsLayer} from '@deck.gl/experimental-layers';
import mapboxgl from 'mapbox-gl';
class App
{
constructor()
{
this.stateInfo = { time: 600 };
}
get state()
{
return this.stateInfo;
}
animate() {
var loopLength = 18000; // unit corresponds to the timestamp in source data
var animationSpeed = 30; // unit time per second
const timestamp = Date.now() / 1000;
const loopTime = loopLength / animationSpeed;
var time = Math.round(((timestamp % loopTime) / loopTime) * loopLength);
// HOW SHOULD I USE time VARIABLE???
window.requestAnimationFrame(this.animate.bind(this));
}
}
var obido = new App();
var tripsLayerObido = new TripsLayer({
id: 'trips',
data: 'trips/tripsKR.json',
getPath: d => d.segments,
getColor: d => (d.vendor === 0 ? [253, 128, 93] : [23, 184, 190]),
opacity: 0.6,
strokeWidth: 30,
trailLength: 180,
currentTime: obido.state.time
});
const LIGHT_SETTINGS = {
lightsPosition: [-74.05, 40.7, 8000, -73.5, 41, 5000],
ambientRatio: 0.05,
diffuseRatio: 0.6,
specularRatio: 0.8,
lightsStrength: [2.0, 0.0, 0.0, 0.0],
numberOfLights: 2
};
export const INITIAL_VIEW_STATE = {
longitude: 19.93,
latitude: 50.03,
zoom: 12.8,
maxZoom: 19,
pitch: 60,
bearing: 0
};
mapboxgl.accessToken = "XXX";
const map = new mapboxgl.Map({
container: 'app',
style: 'mapbox://styles/elninopl/cjnlge6rl094w2so70l1cf8y5',
center: [INITIAL_VIEW_STATE.longitude, INITIAL_VIEW_STATE.latitude],
zoom: INITIAL_VIEW_STATE.zoom,
pitch: INITIAL_VIEW_STATE.pitch,
layers: [tripsLayerObido]
});
map.on('load', () => {
obido.animate(0);
});
【问题讨论】:
-
嗨,请编辑您的问题以准确解释发生了什么(“它不起作用”没有帮助)。我还会再看一下标签(建议您首先添加 javascript)。最后,请澄清你为什么不想使用反应。谢谢。
-
我还建议您创建一个示例,让其他人可以轻松上手。我建议您的问题是您从不告诉任何要重新渲染的内容。 React 中的
this.setState会触发渲染,您在这里没有这样做。你想要类似于deck.setProps的东西,但是你正在将 mapbox 自定义层与 Deck GL 结合起来,我不知道如何在那里做。
标签: javascript reactjs deck.gl