如何让Map定位到指定位置?地图标记显示异常求助
解决Codename One地图标记消失与初始定位问题
嘿,我来帮你搞定这两个地图相关的麻烦!
一、标记显示后被地图覆盖的问题
从你的代码片段来看,问题大概率出在容器的层级和添加方式上。你用了LayeredLayout的Form,但只把MapContainer添加到了Form里,却没把存放标记的markers容器加进去——就算加了,如果顺序不对,MapContainer也会盖在它上面(LayeredLayout是按添加顺序堆叠,后加的在顶层)。
更省心的方式是:Codename One的MapContainer本身就支持直接添加标记,不需要额外创建Container。你可以这样修改代码:
public void showOnMap(Coord location) { Form mapDemo = new Form("Maps", new BorderLayout()); // 用BorderLayout更适配单组件填充场景 if (BrowserComponent.isNativeBrowserSupported()) { System.out.println("Browser Component Supported"); MapContainer mc = new MapContainer(MAPS_KEY); // 直接在MapContainer内添加标记 Style markerStyle = new Style(); markerStyle.setFgColor(0xff0000); markerStyle.setBgTransparency(0); mc.addMarker( EncodedImage.createFromImage(FontImage.createMaterial(FontImage.MATERIAL_PLACE, markerStyle, 48), false), location, "标记标题", "标记描述", evt -> { // 标记点击事件逻辑 ToastBar.showMessage("点击了标记!", FontImage.MATERIAL_INFO); } ); // 先设置初始定位(下文详细讲) mc.setCameraPosition(location); mc.setZoom(15); mapDemo.add(BorderLayout.CENTER, mc); mapDemo.show(); } }
如果你坚持要用LayeredLayout,记得把markers容器添加到Form,并且放在MapContainer之后(确保在顶层),还要给标记组件绑定对应坐标:
// 创建markers容器后 mapDemo.add(mc); mapDemo.add(markers); // 后添加的容器在LayeredLayout上层 // 给标记组件设置MapLayout位置 Component marker = new Label(FontImage.createMaterial(FontImage.MATERIAL_PLACE, new Style())); markers.add(marker, MapLayout.mapLayout(location));
二、让地图打开时定位到特定位置
这个操作很简单,MapContainer提供了setCameraPosition()方法,直接传入你的Coord对象即可,还可以搭配setZoom()设置初始缩放级别:
// 在添加完标记后调用 mc.setCameraPosition(location); // 定位到目标坐标 mc.setZoom(15); // 缩放级别数值越大,地图视角越近
这样地图打开后就会直接聚焦到你指定的位置,不会默认跳到美国区域啦!
内容的提问来源于stack exchange,提问作者user1622343
相关产品推荐
相关产品推荐

