infoWindow 的图像在第一次单击时不显示,但在第二次单击时有效
infoWindow's image not showing on first click, but it works on second click
我的 android 使用 Google 地图 android API,InfoWindow 的图像在第一次单击时不显示,但在第二次单击时有效
我使用
自定义信息窗口
void setMapInfoWindow(){
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
@Override
public View getInfoContents(Marker arg0) {
View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
final ImageView img = (ImageView)v.findViewById(R.id.imageView3);
//image
Picasso.with(context).load("http://imgurl").resize(140,
}
});
}
这是我的标记设置过程
void setMarkers(){
...
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject datas=jsonArray.getJSONObject(i);
MarkerOptions tmp=new MarkerOptions()
.title("name")
.alpha(0.6f)
.position(new LatLng(123,456));//replace LatLng with sample
marker=mMap.addMarker(tmp);
}
....
setMapInfoWindow();
}
完成Marker的设置后,调用setMapInfoWindow()
函数。
它在我的智能手机上工作,但是当你第一次点击信息窗口时,它不会显示图像;但它在第二次点击时显示。
我测试了一些情况:
- 将网页图片替换为本地图片,问题依旧
- 将所有marker存入ArrayList,所有处理完成后,将所有marker设置为
showInfoWindow()
,然后将所有marker设置为hideInfoWindow()
。可以,但是有一个infoWindow不能关闭(最后一个)。
- 我正在尝试使用位图来获取图像,但它没有显示图像,我尝试了很多来自 Whosebug 的方法。但它在使用 Picasso 库时有效。
谢谢
解决的问题:
似乎 google 网络服务的图像 URL 在加载时将更改为另一个 URL。
示例:
https://maps.googleapis.com/maps/api/place/photo?photoreference=
google将改为跟随URL:
所以我把booleannot_first_time_showing_info_window改成了int,回调了3次
int not_first_time_showing_info_window=0;
//show image
try {
if(not_first_time_showing_info_window==2){
not_first_time_showing_info_window=0;
Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img);
}
else if (not_first_time_showing_info_window==1) {
not_first_time_showing_info_window++;
Picasso.with(HomeActivity.this).load("http://....").resize(600, 400).into(img,new InfoWindowRefresher(marker));
}else if(not_first_time_showing_info_window==0){
not_first_time_showing_info_window++;
Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img,new InfoWindowRefresher(marker));
}
} catch (Exception e) {
img.setImageDrawable(null);
}
首先,您可以自定义回调 class 来实现 com.squareup.picasso.Callback
:
private class InfoWindowRefresher implements Callback {
private Marker markerToRefresh;
private InfoWindowRefresher(Marker markerToRefresh) {
this.markerToRefresh = markerToRefresh;
}
@Override
public void onSuccess() {
markerToRefresh.showInfoWindow();
}
@Override
public void onError() {}
}
其次,在 activity:
中声明一个布尔变量
boolean not_first_time_showing_info_window;
三、实现public View getInfoContents(Marker marker)
方法:
@Override
public View getInfoContents(Marker marker) {
View v = getLayoutInflater().inflate(R.layout.custom_window, null);
ImageView image = (ImageView)v.findViewById(R.id.image_view);
if (not_first_time_showing_info_window) {
Picasso.with(MainActivity.this).load("image_URL.png").into(image);
} else {
not_first_time_showing_info_window = true;
Picasso.with(MainActivity.this).load("image_URL.png").into(image, new InfoWindowRefresher(marker));
}
return v;
}
您也可以访问 this GitHub page 以查看已完成的实施。
我想 Google 一直在倾听,这是适合我的解决方案。在设置集群时,
getMap().setOnMapLoadedCallback(mOnMapLoaded);
加载地图后,可以从 clusterManager 中检索所有标记,
private GoogleMap.OnMapLoadedCallback mOnMapLoaded = () -> {
LogUtil.i(TAG, "Map has been loaded.");
showInfoWindow();
};
private boolean showInfoWindow() {
final WorkHeader selected = mWorkContainer.getSelectedHeader();
Collection<Marker> markers = mClusterManager.getMarkerCollection().getMarkers();
for (Marker marker : markers) {
if (marker.getTitle().contains(selected.siteName)) {
if (marker.getTitle().contains(selected.siteAddress)) {
mClusterManager.onMarkerClick(marker);
return true;
}
}
}
return false;
}
我在使用 Glide 而不是 Picasso 时遇到了同样的问题
但我做了一个简单的解决方案,我不知道它的效率如何,但对我来说效果很好,无论如何我想与你分享
private Marker lastClicked;
private HashSet<String> markerIdSet=new HashSet<>();
@Override
public boolean onMarkerClick(Marker marker) {
lastClicked=marker;
if(!markerIdSet.contains(marker.getId()))
{
marker.showInfoWindow();
marker.hideInfoWindow();
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
lastClicked.showInfoWindow();
}
},150);
markerIdSet.add(marker.getId());
return true;
}
else
{
marker.showInfoWindow();
return true;
}
}
所以基本上你会创建一个 HashSet 的字符串 (markerID)
如果 HashSet 不包含该标记 id,那么我们将其添加到 HashSet,并调用 marker.showInfoWindow();
显示信息窗口并调用 marker.hideInfoWindow();
隐藏它然后使用 Handler 对象,代码执行将等待 150 毫秒,然后显示再次调用 marker.showInfoWindow();
的信息窗口,这样做您将获得第一次点击的照片。
从技术上讲,您强制代码在每个标记的第一次自动单击标记两次。
如果有效请告诉我。
我的 android 使用 Google 地图 android API,InfoWindow 的图像在第一次单击时不显示,但在第二次单击时有效
我使用
自定义信息窗口void setMapInfoWindow(){
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
@Override
public View getInfoContents(Marker arg0) {
View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
final ImageView img = (ImageView)v.findViewById(R.id.imageView3);
//image
Picasso.with(context).load("http://imgurl").resize(140,
}
});
}
这是我的标记设置过程
void setMarkers(){
...
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject datas=jsonArray.getJSONObject(i);
MarkerOptions tmp=new MarkerOptions()
.title("name")
.alpha(0.6f)
.position(new LatLng(123,456));//replace LatLng with sample
marker=mMap.addMarker(tmp);
}
....
setMapInfoWindow();
}
完成Marker的设置后,调用setMapInfoWindow()
函数。
它在我的智能手机上工作,但是当你第一次点击信息窗口时,它不会显示图像;但它在第二次点击时显示。
我测试了一些情况:
- 将网页图片替换为本地图片,问题依旧
- 将所有marker存入ArrayList,所有处理完成后,将所有marker设置为
showInfoWindow()
,然后将所有marker设置为hideInfoWindow()
。可以,但是有一个infoWindow不能关闭(最后一个)。 - 我正在尝试使用位图来获取图像,但它没有显示图像,我尝试了很多来自 Whosebug 的方法。但它在使用 Picasso 库时有效。
谢谢
解决的问题: 似乎 google 网络服务的图像 URL 在加载时将更改为另一个 URL。
示例:
https://maps.googleapis.com/maps/api/place/photo?photoreference=
google将改为跟随URL:
所以我把booleannot_first_time_showing_info_window改成了int,回调了3次
int not_first_time_showing_info_window=0;
//show image
try {
if(not_first_time_showing_info_window==2){
not_first_time_showing_info_window=0;
Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img);
}
else if (not_first_time_showing_info_window==1) {
not_first_time_showing_info_window++;
Picasso.with(HomeActivity.this).load("http://....").resize(600, 400).into(img,new InfoWindowRefresher(marker));
}else if(not_first_time_showing_info_window==0){
not_first_time_showing_info_window++;
Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img,new InfoWindowRefresher(marker));
}
} catch (Exception e) {
img.setImageDrawable(null);
}
首先,您可以自定义回调 class 来实现 com.squareup.picasso.Callback
:
private class InfoWindowRefresher implements Callback {
private Marker markerToRefresh;
private InfoWindowRefresher(Marker markerToRefresh) {
this.markerToRefresh = markerToRefresh;
}
@Override
public void onSuccess() {
markerToRefresh.showInfoWindow();
}
@Override
public void onError() {}
}
其次,在 activity:
中声明一个布尔变量boolean not_first_time_showing_info_window;
三、实现public View getInfoContents(Marker marker)
方法:
@Override
public View getInfoContents(Marker marker) {
View v = getLayoutInflater().inflate(R.layout.custom_window, null);
ImageView image = (ImageView)v.findViewById(R.id.image_view);
if (not_first_time_showing_info_window) {
Picasso.with(MainActivity.this).load("image_URL.png").into(image);
} else {
not_first_time_showing_info_window = true;
Picasso.with(MainActivity.this).load("image_URL.png").into(image, new InfoWindowRefresher(marker));
}
return v;
}
您也可以访问 this GitHub page 以查看已完成的实施。
我想 Google 一直在倾听,这是适合我的解决方案。在设置集群时,
getMap().setOnMapLoadedCallback(mOnMapLoaded);
加载地图后,可以从 clusterManager 中检索所有标记,
private GoogleMap.OnMapLoadedCallback mOnMapLoaded = () -> {
LogUtil.i(TAG, "Map has been loaded.");
showInfoWindow();
};
private boolean showInfoWindow() {
final WorkHeader selected = mWorkContainer.getSelectedHeader();
Collection<Marker> markers = mClusterManager.getMarkerCollection().getMarkers();
for (Marker marker : markers) {
if (marker.getTitle().contains(selected.siteName)) {
if (marker.getTitle().contains(selected.siteAddress)) {
mClusterManager.onMarkerClick(marker);
return true;
}
}
}
return false;
}
我在使用 Glide 而不是 Picasso 时遇到了同样的问题 但我做了一个简单的解决方案,我不知道它的效率如何,但对我来说效果很好,无论如何我想与你分享
private Marker lastClicked;
private HashSet<String> markerIdSet=new HashSet<>();
@Override
public boolean onMarkerClick(Marker marker) {
lastClicked=marker;
if(!markerIdSet.contains(marker.getId()))
{
marker.showInfoWindow();
marker.hideInfoWindow();
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
lastClicked.showInfoWindow();
}
},150);
markerIdSet.add(marker.getId());
return true;
}
else
{
marker.showInfoWindow();
return true;
}
}
所以基本上你会创建一个 HashSet 的字符串 (markerID)
如果 HashSet 不包含该标记 id,那么我们将其添加到 HashSet,并调用 marker.showInfoWindow();
显示信息窗口并调用 marker.hideInfoWindow();
隐藏它然后使用 Handler 对象,代码执行将等待 150 毫秒,然后显示再次调用 marker.showInfoWindow();
的信息窗口,这样做您将获得第一次点击的照片。
从技术上讲,您强制代码在每个标记的第一次自动单击标记两次。
如果有效请告诉我。