Google Maps v2 - встановлення мого місцезнаходження та збільшення масштабу


123

Моє запитання: чи хтось знає, як налаштувати карти Google, відкрити як моє місцезнаходження, так і в збільшеному вигляді?

В даний час головний погляд відкривається до Африки, весь шлях зменшується.

І тому я шукаю цілими днями, і все, що я можу знайти:

1) Ви не можете анімувати дві речі (наприклад, збільшення та перехід до мого місця розташування) на одній карті Google? Тож якщо я можу розібратися, як встановити зум до того, як встановити анімацію, тоді ця проблема буде вирішена. Це, як правило, проблема, ви можете змінити одне, але не те і інше.

2) Я знайшов інші класи, які можуть бути корисними, але немає допомоги щодо налаштування коду, щоб клас маніпулював картою Google.

Це код, якого я дотримувався дотепер, деякі працюють, деякі - ні. Деякі, які я думав, можуть бути корисні згодом.

package com.MYWEBSITE.www;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity {
private GoogleMap map;  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);

    //LocationSource a = (LocationSource) getSystemService(Context.LOCATION_SERVICE);
    //LocationManager b = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //map.setLocationSource(a);

    Criteria criteria = new Criteria();
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    String provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);
    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    LatLng coordinate = new LatLng(lat, lng);

    //CameraPosition.Builder x = CameraPosition.builder();
    //x.target(coordinate);
    //x.zoom(13);

    //Projection proj = map.getProjection();
    //Point focus = proj.toScreenLocation(coordinate);

    //map.animateCamera(CameraUpdateFactory.newLatLng(coordinate));
    map.animateCamera(CameraUpdateFactory.zoomBy(13));
    //map.moveCamera(CameraUpdateFactory.newLatLng(coordinate));


    ////LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
}
}

Відповіді:


205

Ви не можете анімувати дві речі (наприклад, збільшення та перехід до мого місця розташування) на одній карті Google?

З точки зору кодування, ви робите їх послідовно:

    CameraUpdate center=
        CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
                                                 -73.98180484771729));
    CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);

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

Тут я спочатку переміщую камеру, потім анімаю камеру, хоча обидва можуть бути animateCamera()дзвінками. Чи GoogleMapоб'єднує їх в одну подію, я не можу сказати, оскільки це проходить дуже швидко. :-)

Ось зразок проекту, з якого я витягнув наведений вище код.


Вибачте, ця відповідь є хибною. Дивіться відповідь Роба, як спосіб по-справжньому зробити це в один кадр, створивши, CameraPositionа потім створивши CameraUpdateз цього CameraPosition.


Не повинно бути прийнятої відповіді. Відповідь Mubeen1992 правильна.
Матвій

1
@AlanHaverty: зразок програми, на яку я посилаюся у відповіді, містить цей код. Це працює чудово. Я щойно тестував його на Nexus 9 під управлінням Android 7.0 і Nexus 6P під управлінням Android 6.0.1. Він пройшов ідеально за пару років. Це не робиться ними в один кадр, і я погоджуюся, що Роб - це чудова відповідь, як я зазначив у своїй відповіді. Якщо ви вважаєте, що у вас є докази того, що цей код не працює, опублікуйте зразок проекту десь.
CommonsWare

@CommonsWare Мої вибачення, під час тестування з вашим кодом верхній лівий кут моєї карти, здавалося, встановлений за допомогою lat lng. Я припускав, що ви неправильно сприйняли те, що зробив .newLatLng (). Я не впевнений, чому це було вимкнено, це, мабуть, було щось інше на моєму кінці, документи api підтверджують вашу справу, вибачте за те, що ви отримаєте тригер щасливим за вашу відповідь! Видалення мого першого коментаря, щоб уникнути плутанини .. Джерело API: developers.google.com/android/reference/com/google/android/gms/…
Алан

168

Можна змінити розташування, масштабування, підшипник і нахил все за один раз. Також можна встановити тривалість animateCamera()дзвінка.

CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(MOUNTAIN_VIEW)      // Sets the center of the map to Mountain View
    .zoom(17)                   // Sets the zoom
    .bearing(90)                // Sets the orientation of the camera to east
    .tilt(30)                   // Sets the tilt of the camera to 30 degrees
    .build();                   // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

Погляньте на документи тут:

https://developers.google.com/maps/documentation/android/views?hl=uk-US#moving_the_camera


52

це просте рішення вашого питання

LatLng coordinate = new LatLng(lat, lng);
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 5);
map.animateCamera(yourLocation);

13

Спробуйте таким чином -

public class SummaryMapActivity extends FragmentActivity implements LocationListener{

 private GoogleMap mMap;
 private LocationManager locationManager;
 private static final long MIN_TIME = 400;
 private static final float MIN_DISTANCE = 1000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.summary_mapview);

    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        }
    }
    mMap.setMyLocationEnabled(true);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, this); 


}

@Override
public void onLocationChanged(Location location) {
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
    mMap.animateCamera(cameraUpdate);
    locationManager.removeUpdates(this);

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}


7

Ви також можете встановити обидва параметри, наприклад,

mMap.moveCamera( CameraUpdateFactory.newLatLngZoom(new LatLng(21.000000, -101.400000) ,4) );

Це визначає вашу карту на певній позиції та масштабуванні. Я використовую це для налаштування своєї карти.


3

Це пізня відповідь, але я думаю, це допоможе. Використовуйте цей метод:

protected void zoomMapInitial(LatLng finalPlace, LatLng currenLoc) {
    try {
        int padding = 200; // Space (in px) between bounding box edges and view edges (applied to all four sides of the bounding box)
        LatLngBounds.Builder bc = new LatLngBounds.Builder();

        bc.include(finalPlace);
        bc.include(currenLoc);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), padding));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Використовуйте цей метод після завантаження карти. Ура!


1

Найпростіший спосіб зробити це - використовувати CancelableCallback. Ви повинні перевірити, що перша дія завершена, а потім подзвонити другу:

mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, size.x, height, 0), new CancelableCallback() {

                @Override
                public void onFinish() {
                    CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(0, 500);
                    mMap.animateCamera(cu_scroll);
                }

                @Override
                public void onCancel() {
                }
            });

0

@ Відповідь CommonsWare насправді не працює. Я виявив, що це працює належним чином:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15));

0

1.Додайте у свій макет код xml для відображення карт.

2.Увімкніть Google Maps api, тоді отримайте ключове місце api, яке нижче.

<fragment
                   android:id="@+id/map"
               android:name="com.google.android.gms.maps.MapFragment"
                    android:layout_width="match_parent"
                    android:value="ADD-API-KEY"
                    android:layout_height="250dp"
                    tools:layout="@layout/newmaplayout" />
        <ImageView
            android:id="@+id/transparent_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@color/transparent" />

3.Додайте цей код у oncreate.

 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(UpadateProfile.this);

4.Додайте цей код після створення. потім перейдіть до поточного місцезнаходження маркером, розміщеним у ньому

@Override
public void onMapReady(GoogleMap rmap) {
    DO WHATEVER YOU WANT WITH GOOGLEMAP
    map = rmap;
    setUpMap();
}
public void setUpMap() {
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  map.setMyLocationEnabled(true);
    map.setTrafficEnabled(true);
    map.setIndoorEnabled(true);
    map.getCameraPosition();
    map.setBuildingsEnabled(true);
    map.getUiSettings().setZoomControlsEnabled(true);
    markerOptions = new MarkerOptions();
    markerOptions.title("Outlet Location");
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng point) {
            map.clear();
            markerOptions.position(point);
            map.animateCamera(CameraUpdateFactory.newLatLng(point));
            map.addMarker(markerOptions);
            String all_vals = String.valueOf(point);
            String[] separated = all_vals.split(":");
            String latlng[] = separated[1].split(",");
            MyLat = Double.parseDouble(latlng[0].trim().substring(1));
            MyLong = Double.parseDouble(latlng[1].substring(0,latlng[1].length()-1));
            markerOptions.title("Outlet Location");
            getLocation(MyLat,MyLong);
        }
    });
}
public void getLocation(double lat, double lng) {
    Geocoder geocoder = new Geocoder(UpadateProfile.this, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
   } catch (IOException e) {
         TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
    }
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}

0

Ви не можете анімувати дві речі (наприклад, збільшення та перехід до мого місця розташування) на одній карті Google.
Тому використовуйте переміщення та анімацію камери для збільшення

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar));
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));

-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0)));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.