我尝试以编程方式布局自定义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");
派对! :)
答案 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()。 我花了几个小时才意识到这一点。