Erstellen Sie ein neues Projekt. Wählen Sie Google Maps Activity und geben Sie den Projektnamen ein, um fortzufahren. Ersetzen Sie den Teil YOUR_KEY_HERE der automatisch generierten res / values / google_maps_api.xml durch Ihren eigenen API-Schlüssel, den Sie erhalten haben.
google_maps_api.xml
<resources>
<!--Abkürzung-->
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY_HERE</string>
</resources>
Starten Sie zu diesem Zeitpunkt das Programm einmal und überprüfen Sie, ob die Karte richtig angezeigt wird.
Erstellen Sie ein Layout für infoWindow. Dieses Mal werde ich es mit nur einer ImageView in LinearLayout einfach machen.
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>
Implementieren Sie InfoWindowAdapter in der onMapReady-Methode von MapsActivity.java.
MapsActivity.java
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//~ Abkürzung ~
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
Marker lastMarker;
View infoWindow;
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
//Beschreiben Sie diesmal den Vorgang hier
return null;
}
});
Der infoWindowAdapter muss sowohl die Methoden getInfoWindow () als auch getInfoContents () überschreiben und den Prozess in die eine schreiben und in die andere null zurückgeben. Beschreiben Sie diesmal den Prozess in getInfoContents (). Deklarieren Sie zur Vereinfachung der Verarbeitung die erforderlichen Variablen lastMarker und infoWindow in der Klasse von 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);
//↑ Danach implementiert
}
return infoWindow;
}
Wie Sie sehen können, wenn Sie den Prozess nach der Implementierung bis zum Ende detailliert verfolgen, wird die Methode getInfoWindow () insgesamt zweimal aufgerufen, wenn Sie versuchen, infoWindow durch Klicken auf die Markierung anzuzeigen. Der Vorgang des Herunterladens des Bildes wird beim ersten Mal ausgeführt und nur infoWindow zurückgegeben. Beim zweiten Mal wird eine Endlosschleife verhindert.
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();
}
}
Beschreiben von DownladImageTask, einer Klasse für die Verarbeitung von Bilddownloads. Da das Image asynchron heruntergeladen werden muss, erbt es AsyncTask. Die URL des Bildes wird beim Aufruf mit execute () als String übergeben und mit den Strings [0] von doInbackground () empfangen. Das Bild wird in ImageView von onPostExecute () festgelegt, das nach Abschluss des Bilddownloads aufgerufen wird. Anschließend wird das Bild in infoWindow durch Aufrufen von marker.showInfoWindow () angezeigt.
Die Markierung ist Sydney, die Standardposition, und das Bild ist die URL dessen, was Sie sehen, wenn Sie in der Webversion von Google Map nach Sydney suchen.
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
Recommended Posts