如何通过滑行在 Google 地图上的 infoWindow 中获取图像 - Android

Posted

技术标签:

【中文标题】如何通过滑行在 Google 地图上的 infoWindow 中获取图像 - Android【英文标题】:How to get image in infoWindow on Google Maps with glide - Android 【发布时间】:2016-10-26 17:06:32 【问题描述】:

我正在使用谷歌地图开发应用程序。 我需要具有两个文本和图像源的 custominfowindow。

这是我的 infocontents() 代码。 使用 firebase、谷歌地图、Glide 但它不起作用请帮忙。

  @Override
    public View getInfoWindow(Marker marker) 
        return null;
    

    @Override
    public View getInfoContents(Marker marker) 
        final View v = getLayoutInflater().inflate(R.layout.custom_window, null);

        infoWindowProfile = (CircleImageView) v.findViewById(R.id.ci_custom_profile);
        infoWindowPr = (TextView) v.findViewById(R.id.tv_custom_pr);
        String uidTemp = marker.getSnippet();
        Log.d("markerproper", "uid(snippet) : " + uidTemp);
        database = FirebaseDatabase.getInstance();
        markerRef = database.getReference().child("truck").child(uidTemp);
        markerRef.addValueEventListener(new ValueEventListener() 
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 
                Map<String, ZariPosts> zariPost = (Map<String, ZariPosts>) dataSnapshot.getValue();
                markerProfileUrl = String.valueOf(zariPost.get("profileUrl"));
                markerPr = String.valueOf(zariPost.get("pr"));
                Log.d("markerproper", "uid(markerProfileUrl) : " + markerProfileUrl);
                Log.d("markerproper", "uid(markerPr) : " + markerPr);


                Glide.with(SearchActivity.this)
                        .load(markerProfileUrl)
                        .centerCrop()
                        .into(infoWindowProfile);

                infoWindowPr.setText(markerPr);
            
            @Override
            public void onCancelled(DatabaseError databaseError) 

            
        );
        return v;
    

【问题讨论】:

参考这个:androidfreakers.blogspot.in/2013/08/… ***.com/questions/16572971/…的可能重复 【参考方案1】:

来自https://github.com/bumptech/glide/issues/290

您可以尝试将以下内容添加到您的 getInfoContent() 方法中。相应地更改 url 和 imageView 名称。

Glide.with(mContext).load(imageURL).asBitmap().override(50,50).listener(new RequestListener<String, Bitmap>() 
    @Override
    public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) 
        e.printStackTrace();
        return false;
    

    @Override
    public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) 
        if(!isFromMemoryCache) marker.showInfoWindow();
        return false;
    
).into(imageView);

【讨论】:

不适用于 4.7.1 版本,因为 isFromMemoryCache 变量不再存在 @TiagoElias 只检查 !dataSource.equals(DataSource.MEMORY_CACHE) @Serega 我最终用毕加索图书馆做到了这一点!还是谢谢你【参考方案2】:

Kotlin 修复:

首先,向为这个问题做出贡献的每个人以及每个喜欢它的人表示深深的“感谢”。我能够用拼凑在一起的代码得到一些东西。 如果您使用 Glide 并遇到此问题,这就是我所拥有的,我正在使用自定义信息窗口,其中数据类设置为标记的标签。

class CompanyMarkerCustomInfoWindow(val context: Context) : GoogleMap.InfoWindowAdapter 

override fun getInfoWindow(marker: Marker?): View? 
    return null


override fun getInfoContents(marker: Marker): View 
    val layoutInflater = (context as Activity).layoutInflater
    val binding = ItemCompanyMapMarkerBinding.inflate(layoutInflater)
    val infoWindowData: CompanyMapMarkerModel? = marker.tag as CompanyMapMarkerModel?
    binding.model = infoWindowData
    binding.executePendingBindings()

    if (infoWindowData?.loadImage != null) 
        val finalImageUrl = Constants.BASE_URL + infoWindowData.loadImage
        Glide.with(context)
            .load(finalImageUrl)
            .placeholder(R.drawable.ic_baseline_broken_image_24)
            .listener(MarkerCallback(marker))
            .into(binding.loadImage)
    

    if (infoWindowData?.companyImage != null) 
        val finalImageUrl = Constants.BASE_URL + infoWindowData.companyImage
        Glide.with(context)
            .load(finalImageUrl)
            .placeholder(R.drawable.ic_baseline_broken_image_24)
            .listener(MarkerCallback(marker))
            .into(binding.companyProfileImage)
    

    return binding.root


class MarkerCallback internal constructor(marker: Marker?) :
    RequestListener<Drawable> 

    var marker: Marker? = null

    private fun onSuccess() 
        if (marker != null && marker!!.isInfoWindowShown) 
            marker!!.hideInfoWindow()
            marker!!.showInfoWindow()
        
    

    init 
        this.marker = marker
    

    override fun onLoadFailed(
        e: GlideException?,
        model: Any?,
        target: Target<Drawable>?,
        isFirstResource: Boolean
    ): Boolean 
        Log.e(javaClass.simpleName, "Error loading thumbnail! -> $e")
        return false
    

    override fun onResourceReady(
        resource: Drawable?,
        model: Any?,
        target: Target<Drawable>?,
        dataSource: DataSource?,
        isFirstResource: Boolean
    ): Boolean 
        onSuccess()
        return false
    

地图结果

【讨论】:

我还没有尝试过您的解决方案,但我想知道。当您在信息窗口打开的同时完全放大时,您是否会陷入无限循环? @ThanosFisherman 这是一个很好的问题,我从来没有遇到过视图或口吃的问题,也有一段时间没有参与过这个项目,但我也很好奇。我一定会在某个时候在那里打一个换行符,看看我想出了什么。 我之所以问,是因为我尝试使用 Coil 遵循类似的方法,但最终陷入无限循环,应用程序最终崩溃。我刚刚用 Glide 尝试了你的解决方案,效果很好!由于无限循环,没有口吃没有崩溃。毕竟我怀疑线圈有问题。可能与此github.com/coil-kt/coil/issues/542 有关【参考方案3】:

简单易用的 Kotlin 解决方案(取自 https://github.com/bumptech/glide/issues/290):

    //initiate those two variables
    private val images: HashMap<Marker, Bitmap> = HashMap()
    private val targets: HashMap<Marker, CustomTarget<Bitmap>> = HashMap()

    //create this inner class
    inner class InfoTarget(var marker: Marker) : CustomTarget<Bitmap>() 
        override fun onLoadCleared(@Nullable placeholder: Drawable?) 
            images.remove(marker)
        

        override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) 
            images.put(marker, resource)
            marker.showInfoWindow()
        
    
    
    //Create this method
    private fun getTarget(marker: Marker): CustomTarget<Bitmap> 
        var target = targets[marker]
        if (target == null) 
            target = InfoTarget(marker)
            targets[marker] = target // missing in original (fixed 2018 August)
        
        return target
    

//insert image here (in your acctual population code)
val image = images[marker]
if (image == null) 
    Glide.with(activity)
        .asBitmap()
        .load(pic_url)
        .dontAnimate()
        .into(getTarget(marker))
 else 
    imageView.setImageBitmap(image)

【讨论】:

【参考方案4】:

使用毕加索,解决了我第一次加载图像的问题。在 CustomInfoAdapter 类中。

override fun getInfoWindow(marker: Marker): View? 
    // This function is required, but can return null if
    // not replacing the entire info window

    // Set the marker's title and snippet to the appropriate text view
    // in the layout created.

    val titleView = contents.findViewById<TextView>(R.id.title)
    titleView.text = marker.title.split("https://")[0] ?: ""

    val phoneView = contents.findViewById<TextView>(R.id.phone)
    phoneView.text = marker.snippet ?: ""
    val userImage = contents.findViewById<ImageView>(R.id.profile_image)
    val photoUri = "https://$marker.title.split("https://")[1]"
    Log.d("InfoWindowAdapter", "getInfoContents: $photoUri")

    Picasso.with(userImage.context)
        .load(photoUri)
        .placeholder(R.drawable.loading_status_animation)
        .error(R.drawable.ic_error_image)
        .into(userImage, object : Callback 
            override fun onSuccess() 
                if (marker.isInfoWindowShown) 
                    marker.hideInfoWindow()
                    marker.showInfoWindow()
                
            

            override fun onError() 
                Log.d("InfoWindow", "onError: An error occured")
            
        )
    return contents


【讨论】:

以上是关于如何通过滑行在 Google 地图上的 infoWindow 中获取图像 - Android的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Marshmallow 上的 Google 地图上显示当前位置?

如何在 iOS 上的 Google 地图标记中添加附加信息

通过包装器中心缩放Google Map?

如何使用已加载 KML 图层的动态 Google 地图上的按钮激活地理定位?

如何验证您在Google地图上的任务纬度和经度上的位置

如何从 Android 上的 Google 地图共享 url 获取坐标