Google Maps标记弹出框偏移问题:Android7三星平板上为何不居中?
标记弹出框偏移至右侧的原因及解决方案
嘿,这种只在三星Android 7平板上出现的弹窗偏移问题我之前也碰过,大概率是设备适配或者旧版地图库的锅,下面给你拆解可能的原因和解决办法:
可能的原因
- 三星自定义UI的“小脾气”:三星在Android 7的设备上对系统UI做了不少自定义修改,包括弹窗的布局计算逻辑,Google Maps的默认InfoWindow在这种自定义环境下,锚点计算可能出了偏差,导致跑到标记右侧去了。
- 旧版地图库的兼容性bug:你用的
17.0.0版本的play-services-maps是2020年左右的版本,相对比较老,针对Android 7平板这类设备的适配可能存在未修复的问题,尤其是大屏设备的布局计算。 - 屏幕缩放的影响:三星平板默认可能开了大于100%的屏幕缩放,旧版地图库没正确处理这种非标准的密度缩放,导致InfoWindow的位置计算错误。
- 自定义布局(可能性低):虽然你代码里用的是默认弹窗,但如果之后加了自定义布局,布局里的gravity、margin设置也可能搞出偏移,但你当前代码没问题,这条可以先排除。
可行的解决办法
升级地图库版本:优先试试更新到较新的稳定版,比如
18.2.0,新版本一般会修复旧版本的设备适配bug。修改build.gradle的依赖:dependencies { implementation 'com.google.android.gms:play-services-maps:18.2.0' }记得同步项目,处理可能的依赖冲突就行。
自定义弹窗+手动调锚点:如果升级后还是不行,就自己写个自定义InfoWindow布局,通过
setInfoWindowAdapter来控制,同时手动调整锚点位置。示例代码:map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { // 加载你自己的弹窗布局 View infoView = getLayoutInflater().inflate(R.layout.custom_info_window, null); TextView titleTv = infoView.findViewById(R.id.tv_title); TextView snippetTv = infoView.findViewById(R.id.tv_snippet); titleTv.setText(marker.getTitle()); snippetTv.setText(marker.getSnippet()); return infoView; } @Override public View getInfoContents(Marker marker) { return null; } });默认锚点是(0.5f, 0.0f)(水平居中,垂直顶对齐),如果弹窗偏右,你可以微调第一个参数,比如改成
0.6f,或者根据设备屏幕密度动态计算合适的锚点值。检查系统缩放设置:可以让用户看看平板的屏幕缩放是不是开了非100%的比例,调回默认100%试试。如果是缩放导致的,你也可以在App里检测当前屏幕缩放比例,动态调整弹窗位置。
三星设备专属适配:如果前面的方法都不行,就针对性地给三星Android 7平板做适配,代码里判断设备型号和系统版本,然后调整锚点:
if (Build.MANUFACTURER.equalsIgnoreCase("samsung") && Build.VERSION.SDK_INT == Build.VERSION_CODES.N) { // 给三星Android 7设备单独调锚点 marker.setInfoWindowAnchor(0.6f, 0.0f); }
内容的提问来源于stack exchange,提问作者alexrnov
相关产品推荐
相关产品推荐

