uni-app中map组件自定义聚合点样式在手机端样式失效
uni-app中map组件自定义聚合点样式在手机端样式失效
信息项 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC开发环境版本 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本 | 3.3.13 |
手机系统 | Android |
手机系统版本 | Android 10 |
手机厂商 | 华为 |
手机机型 | note9 |
页面类型 | nvue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码:
<template>
<view class="content">
<map id="map" class="map" :show-location="true" :latitude="latitude" :longitude="longitude"></map>
</view>
</template>
<script>
const img = '/static/logo.png';
export default {
data() {
return {
latitude: 23.099994,
longitude: 113.324520,
}
},
onReady() {
this._mapContext = uni.createMapContext("map", this);
// 仅调用初始化,才会触发 on.("markerClusterCreate", (e) => {})
this._mapContext.initMarkerCluster({
enableDefaultStyle: false,
zoomOnClick: true,
gridSize: 60,
complete(res) {
console.log('initMarkerCluster', res)
}
});
this._mapContext.on("markerClusterCreate", (e) => {
debugger
let clusterMarkers = []
// const clusters = e.clusters // 新产生的聚合簇
const clusters = e // 新产生的聚合簇
console.log(clusters)
clusters.forEach((cluster,index) => {
const {
center, // 聚合点的经纬度数组
clusterId, // 聚合簇id
markerIds // 已经聚合了的标记点id数组
} = cluster
debugger
let clusterObj = {clusterId,
width: 50,
height: 50,
iconPath: '',
label: {// 定制聚合簇样式
fontSize: 16,
color: '#fff',
width: 50,
height: 50,
bgColor: '#22ac38',
borderRadius: 25,
textAlign: 'center',
anchorX: -10,
anchorY: -35,
}
}
clusterMarkers.push(clusterObj)
})
// 添加聚合簇
this._mapContext.addMarkers({
markers:clusterMarkers,
clear: false, //是否先清空地图上所有的marker
})
console.log(clusterMarkers)
// console.log("markerClusterCreate", e);
});
this.addMarkers();
},
methods: {
addMarkers() {
const marker = {
id: 1,
iconPath: img,
width: 50,
height: 50,
joinCluster: true, // 指定了该参数才会参与聚合
label: {
width: 50,
height: 30,
borderWidth: 1,
borderRadius: 10,
bgColor: '#ffffff'
}
};
const positions = [{
latitude: 23.099994,
longitude: 113.324520,
}, {
latitude: 23.099994,
longitude: 113.322520,
}, {
latitude: 23.099994,
longitude: 113.326520,
}, {
latitude: 23.096994,
longitude: 113.329520,
}]
const markers = []
positions.forEach((p, i) => {
const newMarker = Object.assign(marker, p)
newMarker.id = i + 1
newMarker.label.content = `label ${i + 1}`
markers.push(newMarker)
this._mapContext.addMarkers({
markers,
clear: false,
complete(res) {
console.log('addMarkers', res)
}
})
})
}
}
}
</script>
<style>
.content {
flex: 1;
}
.map {
flex: 1;
}
</style>
操作步骤:
- 在安卓手机上打开地图,聚合点样式会发生改变
预期结果:
- 聚合点样式发生改变
实际结果:
- 样式没变
bug描述:
- uniapp中使用map组件自定义聚合点样式,在APP端nvue页面样式失效
贴个图看看效果
已贴,我已经把底色换成绿色了,但是没有变化
有么有人能解决一下
聚合时也加上joinCluster: true, 安卓自定义样式可以生效,但ios不生效 [挠头]
const {
center, // 聚合点的经纬度数组
clusterId, // 聚合簇id
markerIds // 已经聚合了的标记点id数组
} = cluster
let clusterObj = {clusterId,
width: 50,
height: 50,
iconPath: ‘’,
** joinCluster: true,**
label: {// 定制聚合簇样式
fontSize: 16,
color: '#fff',
width: 50,
height: 50,
bgColor: '#22ac38',
borderRadius: 25,
textAlign: 'center',
anchorX: -10,
anchorY: -35,
}
}
发现ios是由于this.mapctx.on(“markerClusterCreate”, (e) => {}) 事件不触发导致的,怎搞 this.mapctx.initMarkerCluster({ enableDefaultStyle: false, zoomOnClick: true, gridSize: 60, success: (res) => { console.log(‘initMarkerCluster’, res) } }); this.mapctx.on(“markerClusterCreate”, (clusters) => { console.log(“markerClusterCreate”, clusters); if (clusters) { this.updateClusters(clusters) } });
不触发,会不会是指向有问题。定义一下let that = this, 试一下呢
回复 1***@qq.com: 一样的代码,安卓没事,ios不触发markerClusterCreate事件,换成别的比如markerClusterClick事件就会触发 [挠头]
回复 1***@qq.com: 不是指向问题,把this,换成that也没啥作用
缩放地图过程中有概率会使用默认的聚合样式,你们遇到过吗?
回复 1***@qq.com: 是的,安卓会这样
有解决这个问题吗
Android 聚合自定义样式存在问题,后续修复
顶
请问现在解决了吗?
回复 9***@qq.com: 链接失效了,请问你这个问题解决了么
回复 Geewoo_c: 解决了,链接能打开没有失效。打不开吗?
回复 9***@qq.com: 安卓好了,苹果自定义的点没了,聚合样式也很淡,裂开…
在 uni-app
中使用 map
组件时,自定义聚合点样式在手机端失效的问题,可能是由于以下原因导致的:
1. 平台差异
uni-app
的map
组件在不同平台(如微信小程序、H5、App)上的实现方式不同,可能会导致样式在某些平台上失效。- 特别是在微信小程序中,
map
组件的聚合点样式可能受到限制。
2. 样式兼容性
- 自定义聚合点样式可能使用了某些 CSS 属性或 JavaScript 方法,这些方法在某些平台上不被支持或表现不一致。
- 例如,微信小程序的
map
组件对自定义样式的支持有限,可能无法完全按照 H5 或 App 的方式实现。
3. 代码实现问题
- 检查代码中是否有平台特定的逻辑,导致在某些平台上样式未正确应用。
- 确保自定义聚合点的代码在所有平台上都能正确执行。
解决方案
1. 检查平台兼容性
- 使用
uni-app
提供的条件编译功能,针对不同平台编写不同的代码。 - 例如:
// #ifdef H5 // H5 平台的自定义聚合点样式 // #endif // #ifdef MP-WEIXIN // 微信小程序平台的自定义聚合点样式 // #endif
2. 使用平台支持的样式
- 确保使用的样式和方法在目标平台上被支持。
- 例如,微信小程序的
map
组件可能不支持某些 CSS 属性,需要使用小程序提供的 API 来实现类似效果。
3. 调试和日志
- 在代码中添加日志,检查自定义聚合点的逻辑是否在手机端正确执行。
- 使用
console.log
或uni.showToast
来调试代码。
4. 使用第三方库
- 如果
uni-app
的map
组件无法满足需求,可以考虑使用第三方地图库(如高德地图、腾讯地图)的 SDK,这些 SDK 通常提供更丰富的功能和更好的跨平台支持。
5. 示例代码
- 以下是一个简单的示例,展示如何在
uni-app
中自定义聚合点样式:<template> <view> <map :latitude="latitude" :longitude="longitude" :markers="markers" @markertap="onMarkerTap" ></map> </view> </template> <script> export default { data() { return { latitude: 39.909, longitude: 116.39742, markers: [ { id: 1, latitude: 39.909, longitude: 116.39742, iconPath: '/static/marker.png', width: 30, height: 30, label: { content: '自定义聚合点', color: '#ffffff', bgColor: '#ff0000', borderRadius: 10, padding: 5, textAlign: 'center' } } ] }; }, methods: { onMarkerTap(e) { console.log('Marker tapped:', e.markerId); } } }; </script>