2013-10-13 2 views
23

как первый вопрос был бы странным, но позвольте мне объяснить ... Предположим, что у нас есть центрированный маркер на карте, когда мы перемещаем карту пальцами, мы видим, что маркер больше не отображается, когда вы выходите из границ области. Итак, как мы можем сделать маркер, который останется всегда в центре карты, хотя мы перемещаем карту в любом месте? Существует приложение с именем UBER, и они предоставляют эту функцию, вы не перетаскиваете маркер, который вы просто перемещаете по карте, а маркер остался его позицией.Как перемещать карту под маркером?

вот скриншот ! [Uber Map Marker] [1]

Как вы можете видеть зеленый маркер находится в центре экрана, когда мы перемещаем карту она оставалась его место, но показывает новое положение, когда пользователь перестает перемещать карту. Как мы можем так себя вести?

У меня есть код, который показывает адрес, когда вы перетаскиваете &. Отбросьте маркер, как насчет отображения адреса снова, но на этот раз не перетащив, перемещая карту? Надеюсь, вы поймете, что любые идеи были бы замечательными.

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)); 
} 
    } 

Вот 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

Проверьте эту ссылку. !! http://stackoverflow.com/questions/13728041/move-markers-in-google-map-v2-android –

+0

это не то, что я прошу .. – regeme

+0

@regeme вы узнали решение? У меня такая же проблема. можете ли вы ответить? Благодаря!! – Shvet

ответ

8

Я не был в состоянии получить приложение эффект Uber, но я был в состоянии сделать что-то подобное, возможно, это будет делать только штрафом для вашего решения, использующей GoogleMap.OnCameraChangeListener.

активность:

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()) 
     ); 
    } 

    ... 

} 

Проблема заключается в том, что маркер не рисуется, когда камера перемещается. Однако кажется, что вы уже создали наложение маркера. Таким образом, с наложением он должен работать как приложение Uber.

Надеюсь, это поможет, даже вопрос в течение нескольких месяцев, возможно, это принесет пользу будущим разработчикам.

Сердечные приветы Miki

1

Проверить this ответ

первый: добавить ImageView к тому же расположение и положение, равное центра.второе: чтобы получить координаты центра карты использовать следующий подход

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; 

А также here мое полное решение

20

Два простых шага:

Шаг 1

Я RelativeLayout как родительский фрагмент с картой и центром в нем ImageView (который будет делать как ориентированный маркер карты так же, как в uber или в простых приложениях для такси):

<!-- 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> 

Шаг 2

метод onMapReady() в моей деятельности я использую GoogleMap метод setOnCameraChangeListener() экземпляра, который позволяет мне слушать, когда карта используется и получить широту и долготу на основе положения центра камеры:

@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); 
     } 
    }); 

} 

ОБНОВЛЕНИЕ:
OnCameraChangeListener устарел. Пожалуйста, используйте OnCameraIdleListener:
[Источник: https://stackoverflow.com/a/38732283/421467]

+0

Это приводит изображение в центр экрана, блокируя значок моего местоположения (синий значок). Я хочу разместить изображение поверх синего значка (например, в Uber). –

+0

есть и Исключение, когда я хочу получить широту и долготу ..... на java.util.ArrayList.throwIndexOutOfBoundsException –

+1

Вы можете поместить вид в центр карты и поставить ImageView над этим представлением. –

2

Если вы используете Fragment для отображения карты Google, положить ImageView внутри Fragment наложение настроенному маркера таким образом, что ваш маркер остается неподвижным, когда вы перемещаете вашу карту. Следуйте код для 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> 

При использовании activity.java файла это:

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

использование setOnCameraChangeListener() чтобы получить широту и долготу на основе положения центра камеры или следовать за ответом, @androidPlusPlus

Смежные вопросы