Créez un nouveau projet. Sélectionnez Activité Google Maps et saisissez le nom du projet pour continuer. Remplacez la partie YOUR_KEY_HERE du fichier res / values / google_maps_api.xml généré automatiquement par votre propre clé API que vous avez obtenue.
google_maps_api.xml
<resources>
<!--Abréviation-->
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY_HERE</string>
</resources>
À ce stade, démarrez le programme une fois et vérifiez que la carte s'affiche correctement.
Créez une mise en page pour infoWindow. Cette fois, je vais simplifier les choses avec un seul ImageView dans LinearLayout.
info_window_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Implémentez InfoWindowAdapter dans la méthode onMapReady de MapsActivity.java.
MapsActivity.java
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//~ Abréviation ~
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
Marker lastMarker;
View infoWindow;
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
//Cette fois, décrivez le processus ici
return null;
}
});
L'infoWindowAdapter doit remplacer les deux méthodes getInfoWindow () et getInfoContents (), écrire le processus dans l'une et renvoyer null dans l'autre. Cette fois, décrivez le processus dans getInfoContents (). De plus, pour faciliter le traitement, déclarez les variables nécessaires lastMarker et infoWindow dans la classe infoWindowAdapter.
@Override
public View getInfoContents(Marker marker) {
if(lastMarker==null || !lastMarker.equals(marker)){
lastMarker = marker;
infoWindow = getLayoutInflater().inflate(R.layout.info_window_layout,null);
ImageView img = infoWindow.findViewById(R.id.img);
new DownloadImageTask(img,marker).execute(imgUrl);
//↑ Mis en œuvre après cela
}
return infoWindow;
}
Comme vous pouvez le voir si vous suivez le processus en détail après l'avoir implémenté jusqu'à la fin, si vous essayez d'afficher infoWindow en cliquant sur le marqueur, la méthode getInfoWindow () sera appelée deux fois au total. Le processus de téléchargement de l'image est exécuté la première fois et renvoie uniquement infoWindow; est exécuté la deuxième fois pour éviter une boucle infinie.
private class DownloadImageTask extends AsyncTask<String,Void, Bitmap>{
ImageView img = null;
Marker marker = null;
DownloadImageTask(ImageView img, Marker marker){
this.img = img;
this.marker = marker;
}
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap bmp = null;
try{
String urlStr = strings[0];
URL url = new URL(urlStr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.connect();
int resp = con.getResponseCode();
switch (resp){
case HttpURLConnection.HTTP_OK:
InputStream is = con.getInputStream();
bmp = BitmapFactory.decodeStream(is);
is.close();
break;
default:
break;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap bmp){
img.setImageBitmap(bmp);
marker.showInfoWindow();
}
}
Décrivez DownladImageTask, qui est une classe pour le traitement du téléchargement d'images. Étant donné que l'image doit être téléchargée de manière asynchrone, elle hérite d'AsyncTask. L'URL de l'image est passée sous forme de chaîne lorsqu'elle est appelée avec execute (), et est reçue avec les chaînes [0] de doInbackground (). L'image est définie dans ImageView par onPostExecute (), qui est appelée une fois le téléchargement de l'image terminé, puis l'image est affichée dans infoWindow en appelant marker.showInfoWindow ().
Le marqueur est la position par défaut de Sydney et l'image est l'URL de ce que vous voyez lorsque vous recherchez Sydney sur la version Web de Google map.
MapsActivity.java
package com.example.test;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
final String imgUrl = "https://lh5.googleusercontent.com/p/AF1QipNUrZvzjGohRsYfuwIpCS2MjYdAq_3xruYM5imS=w408-h271-k-no";
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
Marker lastMarker;
View infoWindow;
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
if(lastMarker==null || !lastMarker.equals(marker)){
lastMarker = marker;
infoWindow = getLayoutInflater().inflate(R.layout.info_window_layout,null);
ImageView img = infoWindow.findViewById(R.id.img);
new DownloadImageTask(img,marker).execute(imgUrl);
}
return infoWindow;
}
});
}
private class DownloadImageTask extends AsyncTask<String,Void, Bitmap>{
ImageView img = null;
Marker marker = null;
DownloadImageTask(ImageView img, Marker marker){
this.img = img;
this.marker = marker;
}
@Override
protected Bitmap doInBackground(String... strings) {
Bitmap bmp = null;
try{
String urlStr = strings[0];
URL url = new URL(urlStr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.connect();
int resp = con.getResponseCode();
switch (resp){
case HttpURLConnection.HTTP_OK:
InputStream is = con.getInputStream();
bmp = BitmapFactory.decodeStream(is);
is.close();
break;
default:
break;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap bmp){
img.setImageBitmap(bmp);
marker.showInfoWindow();
}
}
}
https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.InfoWindowAdapter https://stackoverflow.com/questions/36335004/how-to-get-image-in-infowindow-on-google-maps-with-picasso-android