uni-app+vue3中安卓应用中使用map组件的polyline的bug
uni-app+vue3中安卓应用中使用map组件的polyline的bug
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
HBuilderX类型:正式
HBuilderX版本号:4.66
手机系统:Android
手机系统版本号:Android 15
手机厂商:小米
手机机型:红米k60pro
页面类型:vue
vue版本:vue3
打包方式:云端
项目创建方式:HBuilderX
示例代码:
<div class="map-wrap">
<map
id="map"
class="map"
:markers="layer.markers"
:longitude="Number(layer.markers[0]?.longitude)"
:latitude="Number(layer.markers[0]?.latitude)"
:polyline="layer.polyline"
></map>
</div>
const result = useQuery({
queryKey: ['rideTrack', ridingId],
queryFn: () => deviceApi.getRideTrack(ridingId.value!),
enabled,
})
const layer = computed(() => {
const data = result.data.value?.data || []
console.log('data>>', data);
if (data.length === 0) {
return {
polyline: [],
markers: [],
averageSpeed: 0,
}
}
const points = data.map((item: any) => ({
longitude: Number(item.longitude),
latitude: Number(item.latitude),
}))
// 彩虹线 speed <10km/h 红色
// 10km/h <= speed < 20km/h 橙色
// speed >= 20km/h 绿色
// Android 没有效果
const colorList = data.slice(1, points.length - 1).map((item) => {
const speed = Number(item.speed)
if (speed < 10) return '#FF3141'
if (speed >= 10 && speed < 20) return '#FF6010'
return '#09AE00'
})
const polyline = [
{
points,
colorList,
width: 6,
arrowLine: true,
},
]
const start = points[0]
const end = points[points.length - 1]
const markers = [
{
id: 1,
iconPath: '/static/images/map-car-start.png',
width: 26,
height: 33,
longitude: start.longitude,
latitude: start.latitude,
},
{
id: 2,
iconPath: '/static/images/map-car-end.png',
width: 26,
height: 33,
longitude: end.longitude,
latitude: end.latitude,
},
]
// Android 没有效果
mapContext.value?.includePoints({
padding: [12, 12, 36, 12],
points,
success: (...args) => {
console.log('我执行了>>> ', args)
}
})
// 计算平均速度
const averageSpeed = (
data.reduce((acc, item) => {
const speed = Number(item.speed)
return acc + speed
}, 0) / data.length
).toFixed(1)
return {
polyline,
markers,
averageSpeed,
}
})
onReady(async () => {
mapContext.value = uni.createMapContext('map')
})
更多关于uni-app+vue3中安卓应用中使用map组件的polyline的bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
是不是你用到了只在 nvue 上生效的属性了
更多关于uni-app+vue3中安卓应用中使用map组件的polyline的bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
应该是的了,查了下文档,上面说的那三个都在nvue里生效,我自己的是普通的vue文件,没生效
在uni-app的map组件中,Android平台对polyline的colorList支持确实存在一些限制。从你的代码来看,问题可能出现在以下几个方面:
- colorList配置问题:Android平台对polyline的colorList支持不如iOS完善,需要确保colorList数组长度与points数组长度严格对应。你的代码中colorList是从data.slice(1, points.length - 1)生成的,这可能导致长度不匹配。
建议修改colorList生成逻辑:
const colorList = data.map((item, index) => {
if (index === 0 || index === data.length - 1) return '#000000' // 首尾点默认颜色
const speed = Number(item.speed)
if (speed < 10) return '#FF3141'
if (speed >= 10 && speed < 20) return '#FF6010'
return '#09AE00'
})
- includePoints回调问题:Android平台下map组件的某些方法回调可能不会触发,这是已知的平台差异。建议添加fail回调进行调试:
mapContext.value?.includePoints({
padding: [12, 12, 36, 12],
points,
success: (...args) => {
console.log('includePoints成功', args)
},
fail: (err) => {
console.log('includePoints失败', err)
}
})
- 地图上下文获取时机:确保onReady在组件完全渲染后执行,可以尝试使用nextTick:
onMounted(() => {
nextTick(() => {
mapContext.value = uni.createMapContext('map')
})
})

