2013-02-12 3 views
18

Я хотел бы заменить значок по умолчанию, который использует Android Maps V2 для «Мое местоположение» (маленькая голубая точка/стрелка) с моим собственным изображением. Я создал свою собственную плиту provider, которая содержит несколько карт, которые преимущественно голубые, и поэтому по умолчанию значок «Мое местоположение» по умолчанию очень трудно увидеть. Раньше я бы просто переопределил метод draw для MyLocationOverlay, но, похоже, в новом api не было ни одного. Любая помощь будет замечательной!Android Maps API v2 Change MyLocation Icon

EDIT: Мне также нужна иконка, чтобы можно было вращать, так же, как стрелка в зависимости от того, с каким видом вы сталкиваетесь. Так что я не могу просто использовать нормальный :(В принципе мне просто нужно создать пользовательский образ для этого стрелки ..

enter image description here

Update Привет всем, обновление для Google играть позволяет теперь плоские маркеры и вращение маркер, который является именно то, что мне нужно было

+0

Вы проверили демо карту v2 Google в вашем SDK, которые продемонстрировали, функциональность добавления маркеров с пользовательским и поворотом изображением это соответственно также. – GrIsHu

+0

Привет, Гришу, я посмотрел примеры в SDK. Какая часть демонстрационного приложения специально смотрит на поворот иконки моего местоположения? Кажется, я не нашел его. – Gyroscope

+0

В демонстрации sdk проверьте класс маркера, который показал способ добавления маркера на карту. – GrIsHu

ответ

19

последнее обновление Google Play Services теперь позволяет использовать маркеры «плоский» и вращать их, которая является именно то, что мне было нужно. Вот простая версия того, как я ее реализовал. Скорее всего, я могу сделать это, чтобы оптимизировать и настроить анимацию, но на данный момент она работает. Любая обратная связь приветствуется.

Marker mPositionMarker; 
GoogleMap mMap; 

@Override 
public void onLocationChanged(Location location) { 

    if (location == null) 
     return; 

    if (mPositionMarker == null) { 

     mPositionMarker = mMap.addMarker(new MarkerOptions() 
       .flat(true) 
       .icon(BitmapDescriptorFactory 
         .fromResource(R.drawable.positionIndicator)) 
       .anchor(0.5f, 0.5f) 
       .position(
         new LatLng(location.getLatitude(), location 
           .getLongitude()))); 
    } 

    animateMarker(mPositionMarker, location); // Helper method for smooth 
               // animation 

    mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location 
      .getLatitude(), location.getLongitude()))); 

} 

public void animateMarker(final Marker marker, final Location location) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    final LatLng startLatLng = marker.getPosition(); 
    final double startRotation = marker.getRotation(); 
    final long duration = 500; 

    final Interpolator interpolator = new LinearInterpolator(); 

    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      long elapsed = SystemClock.uptimeMillis() - start; 
      float t = interpolator.getInterpolation((float) elapsed 
        /duration); 

      double lng = t * location.getLongitude() + (1 - t) 
        * startLatLng.longitude; 
      double lat = t * location.getLatitude() + (1 - t) 
        * startLatLng.latitude; 

      float rotation = (float) (t * location.getBearing() + (1 - t) 
        * startRotation); 

      marker.setPosition(new LatLng(lat, lng)); 
      marker.setRotation(rotation); 

      if (t < 1.0) { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } 
     } 
    }); 
} 
+0

Не работает так хорошо:/ – Nima

+0

Учитывается ли это для подшипника? –

+0

Почему эта строка дает мне ошибку Несовместимая ошибка? final Интерполятор-интерполятор = новый LinearInterpolator(); –

-2

Вы можете изменить текущий значок местоположения, выполнив:.

mMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude())) 
        .title("Current Location") 
        .snippet(address) 
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_image))); 
+0

@ Гироскоп Эй, это сработало или нет? – KunalK

+0

можно сделать заголовок на изображении .title («Текущее местоположение») = установить в образе адрес заголовка, установленный на изображении, можно сделать его ....... или если вы знаете, что ... – Amitsharma

24

мой простой способ решения просто отключить «мой locatio п»карты Google

и создать ImageView на карте с моей иконкой затем захватить ImageView с

OnClick и getMyLocation, animateCamera в OnClick

this.mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false); 
this.mGoogleMap.setMyLocationEnabled(true); 

.

@Override 
public void onClick(final View v) { 

    Location location = this.mGoogleMap.getMyLocation(); 

     if (location != null) { 

      LatLng target = new LatLng(location.getLatitude(), location.getLongitude()); 
      CameraPosition position = this.mGoogleMap.getCameraPosition(); 

      Builder builder = new CameraPosition.Builder(); 
      builder.zoom(15); 
      builder.target(target); 

      this.mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(builder.build())); 

      }  
} 
0

Вы не можете обрабатывать событие нажмите кнопку MyLocation на карте Google, да, но есть уловка, с помощью которого вы можете получить поведение в соответствии с вашими потребностями:
сначала в файле layout.xml добавить карту и соску Кнопка MyLocation.
Вы можете добиться этого с помощью Relative Layout:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

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

    <Button 
     android:id="@+id/myLocationButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="10dp" 
     android:layout_marginTop="10dp" 
     android:background="@drawable/mylocation" /> 
</RelativeLayout> 


Вы можете взять "mylocation.png" Похоже, у увидеть на карте Google.
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

Criteria criteria = new Criteria(); 
    String s = locationManager.getBestProvider(criteria, false); 

    Location location = locationManager.getLastKnownLocation(s); 

вызова нажмите событие вашей фиктивной кнопки MyLocation, в котором вы будете добавлять маркер
private GoogleMap googleMap; googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); googleMap.addMarker(new MarkerOptions().icon(YOUR_MODIFIED_ICON).position(latLng).title(TITLE).snippet(SNIPET));
Таким образом, вы можете изменить значок карты Google по умолчанию.
Да и вам необходимо установить уровень масштабирования:
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

4

На 3.1.36 вы не можете изменить значок (я чувствую, что это изменится в будущем, но, глядя на скорость внедрения улучшений API v2, его не будет до Рождества).

Вы можете использовать маркер сейчас, потому что он имеет функцию setIcon.

В основном вы должны забыть о GoogleMap.setMyLocationEnabled, потому что он всегда будет отображаться выше.Вместо этого вы создадите свой собственный LocationClient и используйте lat, long и подшипник от Location, чтобы обновить Marker. Дополнительно добавьте Circle и используйте точность, чтобы эффект был похож на визуализацию myLocation по умолчанию.

0

попробуйте это; Я использую это для нарисовать маршрут на карте, но я установить иконки для маркеров и для моего местоположения Объявите это для просмотра местоположения:

LocationManager locationManager = (LocationManager) 
    getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String provider = locationManager.getBestProvider(criteria, true); 
    Location myLocation= locationManager.getLastKnownLocation(provider); 

    longitude = myLocation.getLongitude(); 
    latitude = myLocation.getLatitude(); 
    fromPosition = new LatLng(latitude, longitude); 

И создать такую ​​функцию, что я использовал для рисования на карта, но я набор иконок на маркеры и моей позиции:

mGoogleMap.clear(); 
if(response.equalsIgnoreCase("Success")) 
{ 
    ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); 
    PolylineOptions rectLine = new PolylineOptions().width(7).color(Color.BLUE); 

    for (int i = 0; i < directionPoint.size(); i++) { 
    rectLine.add(directionPoint.get(i)); 
    } 
    // Adding route on the map 
    mGoogleMap.setOnMarkerClickListener(MainActivity.this); 
    mGoogleMap.addPolyline(rectLine); 
    markerOptions.position(fromPosition); 
    markerOptions.draggable(true); 
    Marker1 = mGoogleMap.addMarker(new MarkerOptions() 
       .position(Estadio) 
       .title("Estadio Cuscatlan") 
       .snippet("Estadio Cuscatlan")              
       .icon(BitmapDescriptorFactory           
       .fromResource(R.drawable.mapmarker))); 
    Marker2 = mGoogleMap.addMarker(new MarkerOptions() 
       .position(Metrocentro) 
      .title("Metrocentro") 
      .snippet("Metrosuelo") 
      .icon(BitmapDescriptorFactory 
      .fromResource(R.drawable.mapmark 
     Marker3 = mGoogleMap.addMarker(new MarkerOptions() 
      .position(Mejicanos) 
      .title("Mejicanos") 
      .snippet("Mejicanos") 
      .icon(BitmapDescriptorFactory 
      .fromResource(R.drawable.mapmarker))); 
     MarkerMe = mGoogleMap.addMarker(new MarkerOptions()            
         .position(fromPosition) 
         .icon(BitmapDescriptorFactory 
         .fromResource(R.drawable.car64))); 
    } 
    Dialog.dismiss(); 
    } 
} 
+0

можете сделать заголовок на image .title («Estadio Cuscatlan») = установленный в образе адрес заголовка, установленный на изображении, может сделать это ........ – Amitsharma

0

Вот код для доступа к кнопке местоположения:

View mv=findViewById(R.id.map); 
     View locationButton = ((View) mv.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2")); 
     RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams(); 
// position on right bottom 
     rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); 
     rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
     rlp.setMargins(0, 180, 180, 0); 
+0

Добро пожаловать в Stack Overflow! Благодарим вас за этот фрагмент кода, который может оказать немедленную помощь. Правильное объяснение [значительно улучшило бы] (// meta.stackexchange.com/q/114762) его образовательное значение, показав * почему * это хорошее решение проблемы и сделало бы его более полезным для будущих читателей с похожими, но не идентичные вопросы. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

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