You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用enableLatestRenderer致Android端react-native-maps Marker子元素闪烁求助

问题解决:Android端React Native Maps Marker闪烁与缩放动画冲突

问题背景

按Google Maps Platform建议升级Android端Maps SDK到最新渲染器,在App.js中调用enableLatestRenderer()后,所有自定义Marker出现闪烁问题。设置tracksViewChanges={false}可消除闪烁,但会导致用Animated.Image实现的Marker选中缩放效果失效。自定义Marker代码如下:

return (
  <Marker
    key={index}
    coordinate={{
      latitude: Number(marker.lat),
      longitude: Number(marker.lng),
    }}
    // tracksViewChanges={false}
    onPress={(e) => onMarkerPress(e)}>
    <Animated.View style={styles.markerStyle}>
      <Animated.Image
        source={require('../../assets/images/appicon.webp')}
        resizeMode='contain'
        style={[styles.markerImage, scaleStyle]}></Animated.Image>
    </Animated.View>
  </Marker>
);

解决方案

方案1:用状态控制样式变换替代Animated组件

放弃Animated.Image,直接通过状态控制Marker内部图片的缩放样式,保持tracksViewChanges默认值(即不设置为false),既规避闪烁又实现选中缩放:

import { useState } from 'react';

// 组件内维护选中Marker的ID状态
const [selectedMarkerId, setSelectedMarkerId] = useState(null);

// 根据选中状态生成缩放样式
const getMarkerScaleStyle = (markerId) => {
  const scale = selectedMarkerId === markerId ? 1.5 : 1;
  return { transform: [{ scale }] };
};

// 自定义Marker部分
return (
  <Marker
    key={index}
    coordinate={{
      latitude: Number(marker.lat),
      longitude: Number(marker.lng),
    }}
    onPress={() => setSelectedMarkerId(marker.id)}>
    <View style={styles.markerStyle}>
      <Image
        source={require('../../assets/images/appicon.webp')}
        resizeMode='contain'
        style={[styles.markerImage, getMarkerScaleStyle(marker.id)]}
      />
    </View>
  </Marker>
);

方案2:调整最新渲染器的配置

在AndroidManifest.xml中添加渲染器配置,尝试禁用可能引发闪烁的特性:

<meta-data
  android:name="com.google.android.gms.maps.v2.API_OPTIONS"
  android:value="liteMode=false;renderer=latest"/>

若仍有问题,可临时回退到旧渲染器(不推荐长期使用,官方后续可能停止支持):
在App.js中替换enableLatestRenderer()为:

import { enableOldRenderer } from 'react-native-maps';

enableOldRenderer();

方案3:开启Animated原生驱动

如果必须保留Animated.Image,给Animated组件开启原生驱动,减少JS层与原生层的交互冲突:

<Animated.View 
  style={styles.markerStyle}
  useNativeDriver={true}
>
  <Animated.Image
    source={require('../../assets/images/appicon.webp')}
    resizeMode='contain'
    style={[styles.markerImage, scaleStyle]}
    useNativeDriver={true}
  />
</Animated.View>

开启原生驱动后,动画由原生层直接处理,可能避免tracksViewChanges导致的闪烁与动画失效问题。

内容的提问来源于stack exchange,提问作者Georgi Uzuntonev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:57:22