【问题标题】:How can I use Picasso to add icon to Marker?如何使用 Picasso 将图标添加到 Marker?
【发布时间】:2014-11-23 23:01:47
【问题描述】:

我想使用 Picasso 检索位图图像以用作标记图标,但我不知道该怎么做。如果我使用 Picasso 将图像插入到图像视图中,我知道我可以使用:

 Picasso.with(MainActivity.this).load(URL).into(photo_imageview);

当然,如果我将它传递给.icon(),这将不起作用

有没有简单的方法来实现这一点?

感谢任何查看此内容的人!

【问题讨论】:

    标签: android google-maps picasso


    【解决方案1】:

    Picasso 提供了一个通用的Target 接口,您可以使用它来实现您自己的图像目标。具体来说,您需要覆盖 onBitmapLoaded 来填充您的标记。

    下面给出了一个基本的实现。

    public class PicassoMarker implements Target {
        Marker mMarker;
    
        PicassoMarker(Marker marker) {
            mMarker = marker;
        }
    
        @Override
        public int hashCode() {
            return mMarker.hashCode();
        }
    
        @Override
        public boolean equals(Object o) {
            if(o instanceof PicassoMarker) {
                Marker marker = ((PicassoMarker) o).mMarker;
                return mMarker.equals(marker);
            } else {
                return false;
            }
        }
    
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
        }
    
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
        }
    
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
    
        }
    }
    

    你会这样使用它--

    marker = new PicassoMarker(myMarker);
    Picasso.with(MainActivity.this).load(URL).into(marker);
    

    注意 Picasso 仅持有传递给intoTarget 的一周引用。因此,marker 引用需要在图像加载之前存在,以避免垃圾收集器清理回调。

    【讨论】:

    • 如何做到这一点?
    • 嘿@iagreen 它只显示默认的android标记而不是图像,请帮帮我。并且未调用 onBitmapLoaded 方法。
    • @AnkitSharma 我必须查看您的代码才能了解可能出现的问题。位图可能无法加载。上面的代码在失败时静默失败。您可以将日志记录添加到 onBitmapFailed 并查看位图是否实际正在加载。
    • 是的,我登录 onBitmapFailed 但没有显示。我怎样才能向你展示我的代码?
    • 打开一个新问题。参考这个问题并说它不起作用。
    【解决方案2】:

    查看这个谷歌地图示例代码,你可以找到一个InfoWindowAdapter 实现来实现它: googlemaps/android-samples

    【讨论】:

      【解决方案3】:

      作为从位图生成图标的@iagreen 答案,您可以使用Iconfactory

      Kotlin 版本:

      class PicassoMarker(
      val marker: Marker,
      private val iconFactory: IconFactory) : Target {
      override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
          Timber.d("picassoMarker onPrepareLoad : ")
      }
      
      override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
          Timber.e("picassoMarker onBitmapFailed: ")
      }
      
      override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
          try {
              if (bitmap != null) {
                  marker.icon = iconFactory.fromBitmap(bitmap)
              }
          } catch (ex: IllegalArgumentException) {
              Timber.e(ex, "Marker is dead")
          }
      }
      
      override fun equals(other: Any?): Boolean {
          if (other is PicassoMarker) {
              return marker == other
          }
          return false
      }
      
      override fun hashCode(): Int {
          return marker.hashCode()
      }}
      

      并像这样使用:

       fun addMarker(marker: Marker): com.mapbox.mapboxsdk.annotations.Marker {
          val markerOption = MarkerOptions().position(marker.latLng)
      
          markerOption.icon =
              iconFactory
                  .fromBitmap(
                      Bitmap.createBitmap(
                          1,
                          1,
                          Bitmap.Config.ARGB_8888
                      )
                  )
      
          val iconFactory = IconFactory.getInstance(context)
      
          val picassoMarker = PicassoMarker(
              mapProvider.map.addMarker(markerOption),
              iconFactory
          )
      
          try {
              val picasso = Picasso.get().apply {
                  this.isLoggingEnabled = true
              }
      
              picasso.load(marker.iconUrl)
                  .noPlaceholder()
                  .into(picassoMarker)
          } catch (ex: Exception) {
              Timber.e(ex, "Picasso crashed")
          }
      
          return picassoMarker.marker
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-22
        • 2023-04-10
        • 2017-10-08
        • 2016-09-26
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 2018-11-21
        • 2018-08-01
        相关资源
        最近更新 更多