it-swarm.com.ru

Android Maps API v2 Изменить значок MyLocation

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

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

enter image description here

Обновление Привет все, обновление в Google Play теперь позволяет плоские маркеры и вращение маркеров, что именно то, что мне было нужно.

22
Gyroscope

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

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

мой простой способ решения проблемы - просто отключить "мое местоположение" на карте 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()));

          }    
}
27
Intathep

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

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

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

4
MaciejGórski

Вы не можете обработать событие нажатия кнопки 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));

1
Bhavana Vadodariya

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

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
user342498

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

    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
José De la O