2013-10-13 19 views
23

come una prima domanda sarebbe strano ma lasciatemi spiegare ... Supponiamo di avere un indicatore centrato sulla mappa, quando spostiamo la mappa con le nostre dita possiamo vedere che l'indicatore non verrà più visualizzato quando uscirai limiti dell'area. Quindi, come possiamo creare un indicatore che rimarrebbe sempre al centro della mappa anche se spostiamo la mappa ovunque? C'è un'app chiamata UBER e forniscono questa funzionalità, non trascini e rilascia l'indicatore semplicemente spostando la mappa e il marcatore rimane la sua posizione.Come spostare una mappa sotto un indicatore?

Ecco uno screenshot ! [Uber Map Marker] [1]

Come si può vedere indicatore verde è al centro dello schermo quando ci si sposta la mappa è rimasto al suo posto, ma mostra la nuova posizione in cui il l'utente smette di spostare la mappa. Come possiamo fare così?

Ho un codice che mostra l'indirizzo quando si trascina il marker &, per quanto riguarda la visualizzazione dell'indirizzo di nuovo ma questa volta non trascinando, spostando la mappa? Spero che tu possa capire che qualsiasi idea sarebbe grandiosa.

public class MainActivity extends AbstractMapActivity implements 
    OnNavigationListener, OnInfoWindowClickListener, 
    OnMarkerDragListener { 
    private static final String STATE_NAV="nav"; 
    private static final int[] MAP_TYPE_NAMES= { R.string.normal, 
    R.string.hybrid, R.string.satellite, R.string.terrain }; 
    private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, 
    GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE, 
    GoogleMap.MAP_TYPE_TERRAIN }; 
private GoogleMap map=null; 
String filterAddress = ""; 
Marker marker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (readyToGo()) { 
     setContentView(R.layout.activity_main); 

     SupportMapFragment mapFrag= 
      (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

     mapFrag.setRetainInstance(true); 
     initListNav(); 

     map=mapFrag.getMap(); 

     if (savedInstanceState == null) { 
      CameraUpdate center= 
       CameraUpdateFactory.newLatLng(new LatLng(
         41.003739, 
         28.999572)); 
      CameraUpdate zoom=CameraUpdateFactory.zoomTo(10); 

      map.moveCamera(center); 
      map.animateCamera(zoom); 

      addMarker(map, 41.003739, 28.999572, R.string.un, R.string.united_nations); 

       map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater())); 
       map.setOnInfoWindowClickListener(this); 
       map.setOnMarkerDragListener(this); 
     } 
    } 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    map.setMapType(MAP_TYPES[itemPosition]); 

    return(true); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    savedInstanceState.putInt(STATE_NAV, 
      getSupportActionBar().getSelectedNavigationIndex()); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); 
} 

@Override 
public void onInfoWindowClick(Marker marker) { 
    Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onMarkerDragStart(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f", 
      position.latitude, 
      position.longitude)); 
} 

@Override 
public void onMarkerDrag(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    LatLng position=marker.getPosition(); 

    String filterAddress = ""; 
    Geocoder geoCoder = new Geocoder(
      getBaseContext(), Locale.getDefault()); 
    try { 
     List<Address> addresses = geoCoder.getFromLocation(
       position.latitude, 
       position.longitude, 1); 

     if (addresses.size() > 0) { 
      for (int index = 0; 
      index < addresses.get(0).getMaxAddressLineIndex(); index++) 
       filterAddress += addresses.get(0).getAddressLine(index) + " "; 
     } 
    }catch (IOException ex) {   
     ex.printStackTrace(); 
    }catch (Exception e2) { 
     // TODO: handle exception 
     e2.printStackTrace(); 
    } 
    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
    TextView myTextView = (TextView) findViewById(R.id.test); 

    myTextView.setText("Address is: " + filterAddress); 

} 

private void initListNav() { 
    ArrayList<String> items=new ArrayList<String>(); 
    ArrayAdapter<String> nav=null; 
    ActionBar bar=getSupportActionBar(); 

    for (int type : MAP_TYPE_NAMES) { 
     items.add(getString(type)); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     nav= 
      new ArrayAdapter<String>(
        bar.getThemedContext(), 
        android.R.layout.simple_spinner_item, 
        items); 
    } 
    else { 
     nav= 
      new ArrayAdapter<String>(
        this, 
        android.R.layout.simple_spinner_item, 
        items); 
    } 

    nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(nav, this); 
} 

private void addMarker(GoogleMap map, double lat, double lon, 
     int title, int snippet) 

{ 
    map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)) 
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin)) 

      .draggable(true)); 
} 
    } 

Ecco l'xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/layout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_below="@+id/img_header" > 

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

<TextView 
    android:id="@+id/test" 
    android:layout_width="match_parent" 
    android:layout_height="90dp" 
    android:layout_alignParentRight="true" 
    android:text="Address : " 
    android:textColor="#FF0000" 
    android:textSize="22sp" /> 
</RelativeLayout> 
+0

Controlla questo collegamento. !! http://stackoverflow.com/questions/13728041/move-markers-in-google-map-v2-android –

+0

questo non è ciò che chiedo .. – regeme

+0

@regeme hai scoperto soluzione? Ho lo stesso problema. puoi mettere la risposta? Grazie!! – Shvet

risposta

8

non ero in grado di ottenere l'effetto app Uber, ma sono stato in grado di fare qualcosa di simile, forse farà bene per la vostra soluzione facendo uso di il GoogleMap.OnCameraChangeListener.

attività:

public class MyActivity extends Activity implements OnCameraChangeListener { 

    ... 

    @Override 
    public void onCameraChange(CameraPosition position) { 
     mMap.clear(); 
     mMap.addMarker(new MarkerOptions() 
      .position(position.target) 
      .title(position.toString()) 
     ); 
    } 

    ... 

} 

Il problema è che il marcatore non viene disegnato mentre la fotocamera viene spostata. Tuttavia, sembra che tu abbia già creato una sovrapposizione di un marcatore. Quindi con una sovrapposizione dovrebbe funzionare come l'applicazione Uber.

Spero che questo aiuti, anche la domanda è di pochi mesi, forse andrà a beneficio degli sviluppatori futuri.

Cordiali saluti Miki

1

check this risposta

prima: aggiungere un ImageView per lo stesso layout e la posizione uguale al centro.secondo: per ottenere la coordinata del centro della mappa utilizzare il seguente approccio

1_ get viewgroup (FrameLayout) in my case where the map fragment is located. 

- FrameLayout myContainer = (FrameLayout) findViewById(R.id.content_frame); 
    int mapHeight = myContainer.getHeight(); 
    int mapWidth = myContainer.getWidth(); 
2_ use setOnCameraChangeListener and on camera change get the coordinates: 

LatLng center = mMap.getCameraPosition().target; 

Ed anche here è la mia soluzione completa

20

due semplici passaggi:

Fase 1

ho usato un RelativeLayout come genitore del frammento con la mappa e al centro in esso un ImageView (che farà da indicatore della mappa centrato proprio come nelle app taxi uber o facili):

<!-- Map and ImageView in center for simulating the map marker --> 
<RelativeLayout 
    android:id="@+id/confirm_address_map_wrapper" 
    android:layout_width="match_parent" 
    android:layout_height="220dp"> 

    <fragment 
     android:id="@+id/confirm_address_map_fragment" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     /> 
    <!-- Image View that acts as map marker notice centerInParent--> 
    <ImageView 
     android:id="@+id/confirm_address_map_custom_marker" 
     android:layout_width="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_height="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_centerInParent="true" 
     android:src="@mipmap/my_map_marker"/> 
</RelativeLayout> 

Fase 2

metodo onMapReady() alla mia attività io uso googleMap metodo di istanza setOnCameraChangeListener() che mi permette di ascoltare quando si utilizza la mappa e ottenere la latitudine e la longitudine in base al centro della posizione della telecamera:

@Override 
    public void onMapReady(GoogleMap googleMap) { 

     googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
     @Override 
     public void onCameraChange(CameraPosition cameraPosition) { 

      Log.i("centerLat",cameraPosition.target.latitude); 

      Log.i("centerLong",cameraPosition.target.longitude); 
     } 
    }); 

} 

UPDATE:
OnCameraChangeListener obsoleto. Si prega di utilizzare OnCameraIdleListener:
[Fonte: https://stackoverflow.com/a/38732283/421467]

+0

Questo porta l'immagine al centro dello schermo bloccando l'icona della mia posizione (icona blu). Voglio posizionare l'immagine sopra l'icona blu (come in Uber). –

+0

c'è ed eccezione quando voglio ottenere latitudine e longitudine ..... a java.util.ArrayList.throwIndexOutOfBoundsException –

+1

Puoi mettere una vista al centro della mappa e mettere l'ImageView sopra questa vista. –

2

Se si utilizza Fragment per visualizzare la mappa di google, mettere il ImageView all'interno del Fragment di sovrapporre il marcatore personalizzato in modo che il marcatore rimane fissa quando si è in movimento la vostra mappa. Seguire il codice per il file xml:

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

    <ImageView 
     android:id="@+id/pin" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:contentDescription="@null" 
     android:src="@drawable/pin" /> 
</fragment> 

Nell'uso del file activity.java questo:

ImageView pinButton = (ImageView) findViewById(R.id.pin); 

uso setOnCameraChangeListener() per ottenere latitudine e longitudine in base al centro della posizione della fotocamera o seguire la risposta fornita da @androidPlusPlus

Problemi correlati