One thing missing from Here Maps is a full screen control, but fortunately it’s possible to add your own custom controls to the map. This isn’t brilliantly documented but a support person from Here Maps was able to help me out with an example. That combined with the fact I’d built something similar in Google Maps before it had its own full screen control. So here’s a TypeScript function that will add a full screen button to a Here Map.
function hereMapsFullScreenControl(ui: H.ui.UI) { // add custom UI control const myCustomControl = new H.ui.Control(); myCustomControl.addClass("customControl"); ui.addControl("myCustomControl", myCustomControl); // Set the position of the control in the UI's layout myCustomControl.setAlignment(H.ui.LayoutAlignment.TOP_RIGHT); const myCustomPanel = new H.ui.base.OverlayPanel(); myCustomPanel.addClass("customPanel"); myCustomControl.addChild(myCustomPanel); // store original styles const mapDiv = ui.getMap().getElement() as HTMLElement; let divStyle: CSSStyleDeclaration = mapDiv.style; if (mapDiv.runtimeStyle) { divStyle = mapDiv.runtimeStyle; } const originalPos: string = divStyle.position; let originalWidth: string = divStyle.width; let originalHeight: string = divStyle.height; // ie8 hack if (originalWidth === "") { originalWidth = mapDiv.style.width; } if (originalHeight === "") { originalHeight = mapDiv.style.height; } const originalTop: string = divStyle.top; const originalLeft: string = divStyle.left; const originalZIndex: string = divStyle.zIndex; let bodyStyle: CSSStyleDeclaration = document.body.style; if (document.body.runtimeStyle) { bodyStyle = document.body.runtimeStyle; } const originalOverflow: string = bodyStyle.overflow; const myCustomButton = new H.ui.base.PushButton({ label: "Full screen", onStateChange: (evt) => { // OK, button state changed... if it's currently down if (myCustomButton.getState() === H.ui.base.Button.State.DOWN) { // go full screen mapDiv.style.position = "fixed"; mapDiv.style.width = "100%"; mapDiv.style.height = "100%"; mapDiv.style.top = "0"; mapDiv.style.left = "0"; mapDiv.style.zIndex = "100"; document.body.style.overflow = "hidden"; } else { // exit full screen if (originalPos === "") { mapDiv.style.position = "relative"; } else { mapDiv.style.position = originalPos; } mapDiv.style.width = originalWidth; mapDiv.style.height = originalHeight; mapDiv.style.top = originalTop; mapDiv.style.left = originalLeft; mapDiv.style.zIndex = originalZIndex; document.body.style.overflow = originalOverflow; } ui.getMap().getViewPort().resize(); }, }); myCustomPanel.addChild(myCustomButton as any); myCustomPanel.setState(H.ui.base.OverlayPanel.State.OPEN); }
3 comments:
Thanks, this was helpful!
Nice one, thanks for sharing
Thank you, really nice !
Post a Comment