毕加索图片没有加载自定义infoWindow为什么?

时间:2016-09-17 21:08:08

标签: android google-maps picasso infowindow

我尝试以编程方式布局自定义infoWindow。我想使用Picasso加载一个streetView预览图像,但图像没有显示出来,任何想法为什么?

private View prepareInfoView(Marker marker){
    //prepare InfoView programmatically
    LinearLayout infoView = new LinearLayout(EarthquakeActivity.this);
    LinearLayout.LayoutParams infoViewParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    infoView.setOrientation(LinearLayout.VERTICAL);
    // attach the above layout to the infoView
    infoView.setLayoutParams(infoViewParams);

    //create street view preview @ top
    ImageView streetViewPreviewIV = new ImageView(EarthquakeActivity.this);
    // this scales the image to match parents WIDTH?, but retain image's height??
    LinearLayout.LayoutParams streetViewImageViewParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    streetViewPreviewIV.setLayoutParams(streetViewImageViewParams);

    String imageURL = "https://maps.googleapis.com/maps/api/streetview?size=200x200&location=";
    String markerLongitude = Double.toString(marker.getPosition().longitude);
    String markerLatitude = Double.toString(marker.getPosition().latitude);
    imageURL += markerLatitude + "," + markerLongitude + "&fov=120&heading=0&pitch=0";
    Log.wtf("prepareInfoView", imageURL);

    Picasso.with(this).load(imageURL).into(streetViewPreviewIV);
    infoView.addView(streetViewPreviewIV);

我已尝试使用和不使用api键添加网址。

没有密钥,它只需点击几下就可以工作,但无论有没有,都没有。是因为它取得的速度太慢所以Android放弃并加载信息窗口而没有它?有没有最好的方法来做到这一点?

另一个图片加载库会更好吗?谷歌的凌空抽射?

还有

  

LinearLayout.LayoutParams

我希望图像在信息窗口的宽度上伸展,即match_parent,并垂直缩放以保持原始宽高比,我该怎么做?

这是我的回答

在commonsWare新类中我添加了这个标志:

@Override
public void onSuccess() {
    Log.i(TAG, "image got, should rebuild window");
    if (marker != null && marker.isInfoWindowShown()) {
        Log.i(TAG, "conditions met, redrawing window");
        marker.setTag(new Boolean("True"));
        marker.showInfoWindow();
    }
}

在prepareInfoView中,我测试了标志缺失。

    if (marker.getTag() == null ) {
        Log.i("prepareInfoView", "fetching image");
        Picasso.with(this).load(imageURL).fetch(new MarkerCallback(marker));
    }
    else {
        Log.wtf("prepareInfoView", "building info window");
派对! :)

5 个答案:

答案 0 :(得分:8)

  

因为获取它太慢所以Android放弃并加载信息窗口没有它吗?

Picasso异步加载,除非图像被缓存。 Maps V2的工作方式是您返回的View转换为Bitmap,这就是呈现的内容。因此,您在Picasso和Maps V2之间存在竞争条件(图像是否在创建Bitmap之前加载?),因此对于任何给定的信息窗口是否有效都是不确定的。 / p>

Picasso加载图片后,您可以在showInfoWindow()上致电Marker,这样您就可以从Picasso的缓存中填充ImageView。在showInfoWindow()上调用的Marker会触发Maps V2重新生成信息窗口。

例如,您可以将现有的into()来电更改为into(streetViewPreviewIV, new MarkerCallback(marker)),其中MarkerCallback为:

  static class MarkerCallback implements Callback {
    Marker marker=null;

    MarkerCallback(Marker marker) {
      this.marker=marker;
    }

    @Override
    public void onError() {
      Log.e(getClass().getSimpleName(), "Error loading thumbnail!");
    }

    @Override
    public void onSuccess() {
      if (marker != null && marker.isInfoWindowShown()) {
        marker.showInfoWindow();
      }
    }
  }
  

另一个图片加载库会更好吗?谷歌的凌空?

他们都会遇到同样的问题。

答案 1 :(得分:6)

对我有用的是:

public class MarkerCallback implements Callback {
    Marker marker=null;
    String URL;
    ImageView userPhoto;


    MarkerCallback(Marker marker, String URL, ImageView userPhoto) {
        this.marker=marker;
        this.URL = URL;
        this.userPhoto = userPhoto;
    }

    @Override
    public void onError() {
        //Log.e(getClass().getSimpleName(), "Error loading thumbnail!");
    }

    @Override
    public void onSuccess() {
        if (marker != null && marker.isInfoWindowShown()) {
            marker.hideInfoWindow();

            Picasso.with(getActivity())
                    .load(URL)                        
                    .into(userPhoto);

            marker.showInfoWindow();
        }
    }
}

答案 2 :(得分:3)

我所知道的是, Picasso异步加载图像,所以当标记显示它的信息窗口后,通过内部调用方法 getInfoContents getInfoWindow 方法, 到目前为止,如果Picasso尚未下载或缓存图像,则不会在infoWindow上显示。 毕加索尝试在下载时将图像加载到 infoWindow 的图像视图中,但根据谷歌地图V2, infoWindows 一旦加载,就无法操作,因此图像不会显示在UI上更新。 但实际上infowindow视图已更新,但无法显示限制,因此如果您只是隐藏并显示 infowindow ,则会更新,并且图像会显示在更新的 infoWindow上即可。你可以用以下方式做到这一点,

您需要保留标记引用,您可以将其保留为Activity / Fragment的成员变量。

public class POJO  {

private String parameter1;
private String parameter2;

   //getters and setters

答案 3 :(得分:0)

我也在努力解决这个问题,这是一个从接受的答案中获得灵感的解决方案。 如果不将图片调整到合适的大小,此解决方案对我无效。使用override()(和centerCrop)就可以了。

跟踪显示的最新图片

private String previousImageUrl = null;

并使用它来查看是否需要刷新当前图像

googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(final Marker marker) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_map_info_window, null);
        MyObject myObject = (MyObject) marker.getTag();
        final String url = myObject.getImageUrl();
        final ImageView imageView = (ImageView) view.findViewById(R.id.image_view);
        GlideApp.with(getContext()).load(url)
                .override(imageWidth, imageHeight) // made the difference
                .centerCrop()
                .into(new SimpleTarget<Drawable>() {
                    @Override
                    public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
                        imageView.setImageDrawable(resource);
                        if (!TextUtils.equals(url, previousImageUrl)) {
                            previousImageUrl = url;
                            marker.showInfoWindow();
                        }
                    }
                });
        return view;
    }
});

答案 4 :(得分:0)

如果您使用可接受的答案来解决问题,但仍然无法解决问题, 您可能正在使用 .fit()。 换句话说,您应该从毕加索代码中删除 .fit()。 我花了几个小时才意识到这一点。