2014-05-25 18 views
5

Ich habe ein InfoWindow in einer GoogleMap mit Schaltflächen und versuche eine Variante von hacked007, um diese zum Arbeiten zu bringen (siehe question).So erhalten Sie die Bildschirmkoordinaten der InfoWindow-Ansicht einer Karte

Mein Ansatz beruht darauf, die Bildschirmkoordinaten der Schaltfläche in InfoWindow zu erhalten und darauf in einer onDispatchTouchEvent Funktion zu arbeiten.

Alle Versuche, die Bildschirmkoordinaten zu erhalten, schlagen jedoch fehl. Ich rufe es innerhalb onDispatchTouchEvent (d. H. Lange nachdem es erstellt wurde), aber ich bekomme 0,0 sowohl für die Schaltfläche und die Ansicht.

Ich nehme an, das ist, weil InfoWindows irgendwie spezielle Fälle sind und nicht tatsächliche UI-Elemente? (IIRC die gesamte Ansicht ist im Grunde nur eine Bitmap, die oben auf der Karte blitted ist?) Gibt es eine Möglichkeit, die Koordinaten zu bekommen? Ich sollte erwähnen, dass ich versuche, alles zu vermeiden, was mit magischen Zahlen zu tun hat, wie die Lösung von chose007 in der Verbindung.

Hier ist eine vereinfachte Darstellung von dem, was ich tue:

public boolean onDispatchTouchEvent(MotionEvent ev) { 
    int[] location = new int[2]; 
    mTestButton.getLocationOnScreen(location); // Returns 0,0 
    mTestView.getLocationOnScreen(location); // Returns 0,0 

    return false; 
} 

public View getInfoContents(Marker marker) { 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mTestView = inflater.inflate(R.layout.info_window, null); 
    mTestButton = ((Button) mTestView.findViewById(R.id.test_button)); 
} 
+1

Sie haben Ihre Annahme richtig, dass die Informationsfenster nur Snapshots sind und nicht Teil der View-Hierarchie.Die einzige Möglichkeit, ihre Position zu bestimmen, sind die "magischen Zahlen" in der Antwort von chosen007, die sie aus der Position des "Markers" und den Abmessungen des Info-Fensters unter Annahme einer Standardverankerung und -rotation berechnen. Ich habe auch eine generische [Implementierung] abgeleitet (https://gist.github.com/corsair992/8313269), die benutzerdefinierte Verankerung und Rotation ermöglicht und das Info-Fenster live macht, ohne es über Touch-Listener zu hacken, was ich diskutiert habe in den Kommentaren zur Antwort. – corsair992

+0

Versuchen Sie, Ihr eigenes 'PopupWindow' anzuzeigen, das an Markerkoordinaten verankert ist. –

Antwort

1

So haben Sie eine Sackgasse auf dem Infofenster getroffen, weil das nicht das, was sollten Sie wirklich individuelle Infofenster zu machen verwenden zu, die Tasten haben und eine solche. Nicht dieser Yankee-Ingenieur würde es nicht so machen.

Wenn Sie etwas Gewohnheit zu zeigen, wenn der Benutzer klickt auf die Markierung dann erfassen die Markierung Klick auf den Marker Ihrer Ansicht zeigen Koordinaten Mitte der Karte auf den Markerkoordinaten und zurück true vomonMarkerClick

https://developers.google.com/maps/documentation/android/marker#marker_click_events

public boolean onMarkerClick (Marker marker) 

Wird aufgerufen, wenn auf einen Marker geklickt oder angetippt wurde. Parameter Markierung Die Markierung, auf die geklickt wurde. Rückgabewerte

true, wenn der Listener das Ereignis verbraucht hat (d. H. Das Standardverhalten sollte nicht auftreten), andernfalls false (d. H. Das Standardverhalten sollte auftreten). Das Standardverhalten besteht darin, dass die Kamera zur Karte bewegt wird und ein Infofenster angezeigt wird.

Also, wie bringe ich etwas über die Karte, das die Form eines Infowindows hat, würde ich ein Bild oder eine ausgefallene Strichzeichnung brauchen, die ich in der Quelle, die ich zum Ausschneiden und Einfügen bearbeitet habe Hier.

Also wie lege ich einen Knopf über die Karte. Gut, dass ich tun kann, aber für dieses Beispiel sind die Tasten in statischen Positionen. Im Pseudo-Infofenster müssen Sie die Schaltfläche oder das Bild an die Koordinaten des Markers verschieben und die Karte möglicherweise auf die Marker-Koordinaten zentrieren.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="32dp" 
     android:layout_marginTop="34dp" > 

     <TextView 
      android:id="@+id/tvSpeed" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/black" 
      android:textSize="55sp" /> 

     <TextView 
      android:id="@+id/tvSpeedUnits" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/black" 
      android:textSize="21sp" /> 
    </LinearLayout> 

    <Button 
     android:id="@+id/btnFollow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="34dp" 
     android:background="@drawable/mapbutton" 
     android:padding="14dp" 
     android:text="@string/btnFollowText" 
     android:textColor="@color/black" /> 

    <TextView 
     android:id="@+id/tvSatLock" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="sat lock" 
     android:textColor="@color/black" 
     android:textSize="21sp" /> 

    <Button 
     android:id="@+id/btnGPS" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@drawable/mapbutton" 
     android:paddingLeft="14dp" 
     android:paddingRight="14dp" 
     android:text="Enable GPS" 
     android:textColor="@color/black" /> 

</RelativeLayout> 

persönlich zeigen, dass ich whould einfach ein Deluxe-transparentes Overlay auf dem gesamten Bildschirm, wenn das Infofenster geklickt wird. Ich meine, der Benutzer muss auf etwas klicken, egal wie.

Viel Glück Signed Ein Klick vor dem InfoWindow-Listener.

Verwandte Themen