diff --git a/examples/feature-move-animation.html b/examples/feature-move-animation.html index 281571fdb6..354450cfa5 100644 --- a/examples/feature-move-animation.html +++ b/examples/feature-move-animation.html @@ -3,10 +3,10 @@ layout: example.html title: Marker Animation shortdesc: Demonstrates how to move a feature along a line. docs: > - This example shows how to use postcompose and vectorContext to - animate a (marker) feature along a line. In this example an encoded polyline + This example shows how to use postrender events and a vector context to + animate a marker feature along a line. In this example an encoded polyline is being used. -tags: "animation, feature, postcompose, polyline" +tags: "animation, feature, postrender, polyline" cloak: - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 value: Your Bing Maps Key from http://www.bingmapsportal.com/ here diff --git a/examples/feature-move-animation.js b/examples/feature-move-animation.js index 45b31ad280..f19b590b70 100644 --- a/examples/feature-move-animation.js +++ b/examples/feature-move-animation.js @@ -7,6 +7,7 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import BingMaps from '../src/ol/source/BingMaps.js'; import VectorSource from '../src/ol/source/Vector.js'; import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from '../src/ol/style.js'; +import {getVectorContext} from '../src/ol/render.js'; // This long string is placed here due to jsFiddle limitations. // It is usually loaded with AJAX. @@ -142,7 +143,7 @@ const map = new Map({ }); const moveFeature = function(event) { - const vectorContext = event.vectorContext; + const vectorContext = getVectorContext(event); const frameState = event.frameState; if (animating) { @@ -176,7 +177,7 @@ function startAnimation() { geoMarker.setStyle(null); // just in case you pan somewhere else map.getView().setCenter(center); - map.on('postcompose', moveFeature); + vectorLayer.on('postrender', moveFeature); map.render(); } } diff --git a/src/ol/render.js b/src/ol/render.js index 8494cb61c7..0f39bf8803 100644 --- a/src/ol/render.js +++ b/src/ol/render.js @@ -2,7 +2,13 @@ * @module ol/render */ import {DEVICE_PIXEL_RATIO} from './has.js'; -import {apply as applyTransform, create as createTransform, scale as scaleTransform} from './transform.js'; +import { + apply as applyTransform, + create as createTransform, + invert as invertTransform, + multiply as multiplyTransform, + scale as scaleTransform +} from './transform.js'; import CanvasImmediateRenderer from './render/canvas/Immediate.js'; @@ -79,14 +85,17 @@ export function toContext(context, opt_options) { } /** - * Gets a vector context for drawing to + * Gets a vector context for drawing to the event's canvas. * @param {import("./render/Event.js").default} event Render event. + * @returns {CanvasImmediateRenderer} Vector context. + * @api */ export function getVectorContext(event) { const frameState = event.frameState; + const transform = multiplyTransform(invertTransform(event.pixelTransform.slice()), frameState.coordinateToPixelTransform); return new CanvasImmediateRenderer( - event.context, frameState.pixelRatio, frameState.extent, - event.pixelTransform, frameState.viewState.rotation); + event.context, frameState.pixelRatio, frameState.extent, transform, + frameState.viewState.rotation); } /** @@ -94,10 +103,11 @@ export function getVectorContext(event) { * @param {import("./render/Event.js").default} event Render event. * @param {import("./pixel.js").Pixel} pixel Css pixel relative to the top-left * corner of the map viewport. + * @returns {import("./pixel.js").Pixel} Pixel on the event's canvas context. * @api */ export function getPixelFromPixel(event, pixel) { const result = pixel.slice(0); - applyTransform(event.pixelTransform, pixel); + applyTransform(invertTransform(event.pixelTransform.slice()), result); return result; }