【问题标题】:react native maps marker custom image cannot change from default反应原生地图标记自定义图像不能从默认更改
【发布时间】:2019-01-23 23:42:36
【问题描述】:

我花了大约 5 个小时试图让它与许多不同的代码排列一起工作,然后重新构建。我无法终生将默认的“红色指针”标记更改为反应原生地图中的默认标记图像。

import MapView, { PROVIDER_GOOGLE } from 'react-native-maps';

...

<MapView
    provider={PROVIDER_GOOGLE}
    style={styles.map}
    ref={ref => {this.map = ref;}}
    minZoomLevel={4}  // default => 0
    maxZoomLevel={10} // default => 20
    enableZoomControl={true}
    showsUserLocation = {true}
    showsMyLocationButton = {true}
    zoomEnabled = {true}
    initialRegion={{
        latitude: 37.600425,
        longitude: -122.385861,
        latitudeDelta: LATITUDE_DELTA,
        longitudeDelta: LONGITUDE_DELTA,
    }}
>
    <MapView.Marker
        coordinate={marker.location}
        image={require('./images/test.png')}        <------ HERE
        width={48}
        height={48}
    />
</MapView>

图像肯定存在于正确的文件夹中,我尝试了不同的图像格式 png/gif/jpg/svg,我尝试使用 {{uri:...}} 和 icon/image,添加和删除宽度/高度属性。似乎没有任何效果。我总是得到默认的红色指针。

我错过了什么明显的东西吗?

当我require 一个不存在的图像或不受支持的类型时,项目打包器/编译器会失败。它绝对可以看到图像,但对它没有任何作用。在模拟器和实际设备上的结果相同。

image={require('./images/test.png')}

这条线什么也没做,好像它被某种方式忽略了。

【问题讨论】:

    标签: react-native google-maps-markers react-native-maps


    【解决方案1】:
    <MapView
        provider={PROVIDER_GOOGLE}
        style={styles.container}
        region={{
            latitude: this.state.latitude,
            longitude: this.state.longitude,
        }}
        >
    
        <Marker
          coordinate={{
            latitude: this.state.latitude,
            longitude: this.state.longitude,
          }}
          description={"This is a marker in React Natve"}
          >
    
          <Image source={require('./man_marker.png')} style={{height: 35, width:35 }} />
    
        </Marker>
    
    </MapView>
    

    【讨论】:

    • 这立即奏效了。我以为我在 5 小时的旅程中尝试了嵌套的 image,但显然不是。非常感谢。现在只需要使用锚点正确“居中”它。干杯!
    • 非常非常感谢!原始文档不提供此解决方案。在文档中,image 是一个标记道具。
    【解决方案2】:

    有两种解决方案:

    第一种方案(推荐)

    使用图像编辑器(例如 Photoshop,...)调整标记图像的大小,并在 marker 中用作 icon

    为此,您可以制作三张不同尺寸的照片(YOUR_MARKER.png、YOUR_MARKER@2x.png、YOUR_MARKER@3x.png)(React Native 会自动显示相应的项目)。

    如果您有大量标记,这是一个很好的解决方案。(您可以参考here 澄清这一点)

    <Marker
        coordinate={ ... }
        tracksViewChanges={false}
        icon={require('./YOUR_MARKER.png')}
    />
    

    第二种方案

    正如@shubham-raitka 所说,您可以在marker 中使用Image

    <Marker
        coordinate={ ... }
    >
        <Image source={require('./YOUR_MARKER.png')} style={{height: 35, width:35 }} />
    
    </Marker>
    

    在这种情况下,如果您的标记数量较多(大约 50 个或更多),则地图性能会非常低。因此,不建议使用此方法

    【讨论】:

      【解决方案3】:

      这是一种在类似情况下对我有用的方法:使用图像代替标记。弹出窗口的工作方式与标记相同。如果你试试这个,图像是从react-native 导入的。实际图片导入为:

      var dotImage = require('./pathToImage.png')

      <Marker
        coordinate={meter.latlng}
        title={"Parking Meter"}
        key={idx}
       >
      <Image
          source={dotImage}
          style={{height: 6, width: 6}}
       />
       </Marker>
      

      【讨论】:

      • 我首先看到了 Shubham Raitka 的回答,但是这个嵌套的 image 标签是我的解决方案。非常感谢
      • 不客气。这是一个很好的问题,我们中的许多人都在努力解决。
      【解决方案4】:

      你给宽度和高度的方式有点奇怪,请用这种方式试试。

      import MapView, { Marker, PROVIDER_GOOGLE } from 'react-native-maps';
      
      const markerImg = require('./images/test.png'); // <-- create a const with the path of the image
      
      <------
      ------>
      <MapView
          provider={PROVIDER_GOOGLE}
          style={styles.map}
          ref={ref => {this.map = ref;}}
          minZoomLevel={4}  // default => 0
          maxZoomLevel={10} // default => 20
          enableZoomControl={true}
          showsUserLocation = {true}
          showsMyLocationButton = {true}
          zoomEnabled = {true}
          initialRegion={{
            latitude: 37.600425,
            longitude: -122.385861,
            latitudeDelta: LATITUDE_DELTA,
            longitudeDelta: LONGITUDE_DELTA,
          }}
      >
      <Marker
          image={markerImg} // <----- add this the const with image
          onPress={() => this.setState({ marker1: !this.state.marker1 })}
          coordinate={{
              latitude: 37.600425,
              longitude: -122.385861,
          }}
          centerOffset={{ x: -18, y: -60 }}
          anchor={{ x: 0.69, y: 1 }}
      />
      </Marker>
      </MapView>
      

      我希望它对你有用,对我有用!

      【讨论】:

      • 我尝试了静态图像对象引用,但这对我也不起作用。嵌套的 image 标记在另一个答案中起作用
      • center-offset 和 anchor 应该用于弹出窗口。用于标记,用户不知道标记的真实位置。从标记偏移和锚定弹出窗口。
      【解决方案5】:

      还没有足够的代表来发表评论,但第一个解决方案有效,我只需要添加 resizeMode 或者如果图像更大,它会切断图像。

      <Marker
          coordinate={ ... }
      >
          <Image source={require('./YOUR_MARKER.png')} style={{height: 35, width:35, resizeMode:"contain" }} />
      
      </Marker>
      

      【讨论】:

        【解决方案6】:
         <Marker
           coordinate={d.driverLocation}
           title={d.driverName}
           description={d.autoNumber}
           onPress={() => console.warn(d.mobaNumbers)}
           image={require("../../../assets/bee.png")}
         >
         </Marker>
        

        【讨论】:

        • 请阅读“How to Answer”。如果您提供解释为什么这是首选解决方案并解释它是如何工作的,它会更有帮助。我们想要教育,而不仅仅是提供代码。
        猜你喜欢
        • 2020-10-28
        • 2015-12-06
        • 2018-12-09
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多