【发布时间】:2011-07-16 11:47:08
【问题描述】:
我想在图像视图上显示静态谷歌地图。共享位置时显示类似于“Whatsapp”的内容。我该怎么做?
【问题讨论】:
标签: android
我想在图像视图上显示静态谷歌地图。共享位置时显示类似于“Whatsapp”的内容。我该怎么做?
【问题讨论】:
标签: android
Google 提供静态地图 API,您需要 API 密钥。
您可以从 Web 下载动态配置的位图,将其存储在文件系统或内存中,然后从中获取可绘制的内容,以便将其设置为 ImageView。
您需要从您的坐标生成一个 url,以使用该 url 从网络加载数据。显示巴黎埃菲尔铁塔的 200x200 位图示例:
String latEiffelTower = "48.858235";
String lngEiffelTower = "2.294571";
String url = "http://maps.google.com/maps/api/staticmap?center=" + latEiffelTower + "," + lngEiffelTower + "&zoom=15&size=200x200&sensor=false&key=YOUR_API_KEY"
StackOverflow 已经有了一些关于如何从网络上下载图像以便在图像视图中显示的答案:link
您可以在此处找到Google Static Maps API 的文档。
【讨论】:
public static Bitmap getGoogleMapThumbnail(double lati, double longi){
String URL = "http://maps.google.com/maps/api/staticmap?center=" +lati + "," + longi + "&zoom=15&size=200x200&sensor=false";
Bitmap bmp = null;
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
InputStream in = null;
try {
in = httpclient.execute(request).getEntity().getContent();
bmp = BitmapFactory.decodeStream(in);
in.close();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bmp;
}
【讨论】:
您现在还可以使用 SDK 在本机显示静态图像(这是 2014 年 12 月添加的): https://developers.google.com/maps/documentation/android/lite
这将产生一个 MapView。
【讨论】:
Web 视图是我的建议。
在asset文件夹的html文件夹中创建一个html文件static_map.html
它的内容可能如下所示
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
html,body{
padding:0;
margin:0;
}
.map{
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<img class="map" src="REPLACE_HERE" >
</body>
</html>
然后以编程方式创建一个静态地图 URL 并用它替换 REPLACE_HERE 字符串。然后将其加载到 Web 视图中。这将大大减少我们的工作量。
代码如下
try {
String url ="https://maps.googleapis.com/maps/api/staticmap?";
url+="&zoom=13";
url+="&size=600x300";
url+="&maptype=roadmap";
url+="&markers=color:green%7Clabel:G%7C"+latitude+", "+longitude;
url+="&key="+ YOUR_GOOGLE_API_KEY;
InputStream is = context.getAssets().open("html/static_map.html");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String str = new String(buffer);
str = str.replace("REPLACE_HERE", url);
wv_map.getSettings().setJavaScriptEnabled(true);
wv_map.loadDataWithBaseURL("", str, "text/html", "UTF-8", "");
} catch (IOException e) {
}
【讨论】:
另外,另一个解决方案是 Picasso 库:“一个强大的 Android 图像下载和缓存库”
你给 Picasso 一个图片 url,然后它会做一个 GET 请求并加载图片。如果请求失败,毕加索可以设置默认图像。
您甚至可以在图像加载时设置进度动画。
这是一个很好且干净的解决方案。
一个例子:
ImageView ivUrl = (ImageView) view.findViewById(R.id.iv_photo);
Picasso.with(getContext()).cancelRequest(ivUrl);
Picasso.with(getContext())
.load(imageUrlString)
.error(R.drawable.ic_error)
.placeholder(R.drawable.progress_animation)
.into(ivUrl);
【讨论】:
String url = "https://maps.googleapis.com/maps/api/staticmap?" +
"center=40.714%2c%20-73.998" +
"&zoom=12&size=400x400" +
"&key=YOUR_API_KEY_GOES_HERE;
Picasso.get()
.load(url)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError(Exception e) {
Toast.makeText(context, "Error to load Maps: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
【讨论】:
正如@pcans 所说,我真的很喜欢他的解决方案。您可以使用字符串作为 URL 在 ImageView 中加载图像。我建议使用第三方库来加载图像: https://github.com/koush/ion
希望对你有帮助:)
【讨论】:
首先,您将显示在可绘制文件夹中的地图图像用作该 imageView 的背景。
【讨论】: