Artikel ini akan bermanfaat bagi mereka yang sebelumnya tidak menggunakan Google Maps SDK dalam pekerjaan mereka.
Di bawah pemotong, metode dasar bekerja dengan peta dijelaskan, seperti menambahkan dan mengelola spidol, cara memindahkan kamera di atas peta, mengendalikan zoom, membangun rute dan geocoding. Serta keterbatasan dan cara untuk menghindarinya.
SumberUntuk menulis artikel, saya terinspirasi oleh pengalaman saya sendiri, yang saya peroleh saat menulis
aplikasi untuk kurir menggunakan peta Google dalam pekerjaan mereka. Jadi semua tangkapan layar dan kemungkinan penyebutan logika bisnis akan terjadi dalam konteks membangun antarmuka kurir.
Sayangnya, Google Maps SDK untuk Android tidak memungkinkan Anda untuk mengubah posisi tombol kontrol, yang disebut Kontrol UI, ini termasuk: IndoorLevelPicker - menampilkan denah bangunan, Kompas - kompas, tombol Lokasiku - buka peta di lokasi saat ini, bilah alat Peta - tombol untuk membangun rute dan membuka peta, serta ZoomControls - menambah dan mengurangi skala peta.
Dengan menggunakan bilah alat Peta dan ZoomControls sebagai contoh, mari kita lihat kesulitan apa yang dapat timbul karena ketidakmampuan untuk mengubah posisi kontrol dan cara menyiasatinya.
Masalah menampilkan kontrol UI dari SDK (disorot dalam warna oranye) dan rekanan khusus mereka (disorot dalam warna hijau)Dalam hal ini, kami memiliki tombol di sudut kanan bawah (tombol aksi mengambang) untuk masuk ke daftar alamat pesanan pengiriman, pada gambar di sebelah kiri Anda dapat melihat bahwa ZoomControls berada di bawahnya dan secara praktis tidak dapat diakses untuk mengklik. Pada gambar di sebelah kanan, ketika Anda mengklik penanda, tombol dari bilah alat Peta muncul, mereka juga muncul di bawah tombol untuk pergi ke daftar pesanan.
SolusiHal pertama yang perlu kita lakukan adalah menyembunyikan tampilan tombol asli. Anda dapat melakukan ini dengan mengganti metode onMapReady, ini dipanggil saat kartu siap digunakan.
Jangan tampilkan tombol Kontrol zoom dan jangan tampilkan tombol membangun rute dari SDKprivate GoogleMap mMap; private UiSettings uiSettings; @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; uiSettings = mMap.getUiSettings();
Kami menambahkan tombol yang diperlukan ke tata letak, di mana mereka harus sesuai dengan desain kami:
Lokasi tombol kontrol peta khususKemudian, dalam metode onCreateView, tentukan tindakan yang harus terjadi ketika tombol kita diklik:
Penangan untuk tombol untuk menambah dan mengurangi skala, serta membangun rute private ImageButton imageButtonZoomIn; private ImageButton imageButtonZoomOut; private ImageButton imageButtonRoute; private GoogleMap mMap; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Kekhasan metode
animateCamera adalah bahwa skala berubah dengan lancar, dan tidak secara instan, dan jika, misalnya, Anda perlu mematikan animasi tombol zoom tertentu ketika skala maksimum atau minimum tercapai, Anda perlu mendefinisikan kembali metode
onCameraIdle , yang disebut ketika skala peta berubah.
Mengaktifkan dan menonaktifkan tombol zoom @Override public void onCameraIdle() { if (mMap.getCameraPosition().zoom == mMap.getMinZoomLevel()){
Untuk melakukan tindakan apa pun dengan marker (kecuali untuk menyeret dan menjatuhkan), misalnya, buat pesanan baru, hapus penanda yang ditempatkan secara acak, buka pesanan yang ada atau panggil telepon seperti ditunjukkan dalam pesanan, tambahkan tombol kontrol yang sesuai ke tata letak dan daftarkan penangannya.
Tombol Kontrol PenandaMemproses klik pada peta untuk menambahkan penanda dan menampilkan tombol kontrol khusus private GoogleMap mMap; private ImageButton imageButtonRoute; @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { imageButtonRoute.setVisibility(View.GONE); if (myMarker !=null){
Kami menunjukkan apa yang ingin kami lakukan dengan marker ketika kami mengklik tombol add order private ImageButton imageButtonAddMarker; private Marker myMarker; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { imageButtonAddMarker = view.findViewById(R.id.imageButtonAddMarker); imageButtonAddMarker.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (myMarker !=null && myMarker.getTag()==null) {
Fitur lain adalah bahwa tidak ada tombol di SDK untuk menghapus penanda pada kartu. Untuk melakukan ini, kami juga membuat tombol sendiri:
Tentukan apa yang ingin kita lakukan dengan marker ketika kita mengklik tombol delete marker private ImageButton imageButtonRemoveMarker; private Marker myMarker; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { imageButtonRemoveMarker = view.findViewById(R.id.imageButtonRemoveMarker); imageButtonRemoveMarker.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (myMarker !=null && myMarker.getTag()==null){
Ketika mengklik penanda, judulnya terbuka, mengklik yang juga dapat digunakan untuk melakukan tindakan apa pun, ketika saya mengklik judul penanda baru, saya membuat pesanan baru untuk pengiriman ke kurir, dan pada penanda pesanan yang ada saya membuka informasi pengiriman rinci, termasuk daftar barang
Tetapkan tindakan saat mengklik pada jendela info penanda private GoogleMap mMap; @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { if (marker.getTag()==null) {
Proses mengeluarkan beberapa marker (baca daftar pesanan) ke kartu pada prinsipnya tidak berbeda dengan output satu marker. Marker terdiri dari koordinat (posisi), judul (title), teks kecil di bawah judul (snippet) dan tag (setTag) - itu dapat digunakan untuk mengidentifikasi banyak penanda pada peta.
Beberapa penanda petaMenggambar banyak marker dengan koordinat yang diberikan public void drawListMarker(List<InfoMarker> latLngList) { if (latLngList == null || latLngList.size() == 0) { return; }
Beberapa kata tentang geocoderGeocoder digunakan untuk mendapatkan alamat berdasarkan koordinat. Menempatkan penanda di peta dan mengklik tombol tambah pesanan, kita mendapatkan koordinat geografis dari titik yang diinginkan, yaitu lintang dan bujur. Tetapi untuk kenyamanan pengguna, akan menyenangkan untuk menunjukkan alamat dalam bentuk yang dapat dibaca manusia, mis., Misalnya, negara, kota, jalan, rumah.
Google Maps SDK berisi kelas
Geocoder , dengan memanggil metode
getFromLocation Anda bisa mendapatkan array alamat pada koordinat yang ditentukan.
Agar tidak memblokir utas UI terlalu lama, terutama jika Internet lambat atau tidak dapat diakses, melalui panggilan - kami akan menggunakan RxJava:
Alamat titik yang dihasilkan pada peta berdasarkan koordinat geografisMenggunakan Java RX untuk mengakses Google geocoder LatLng position = myMarker.getPosition(); Location location = new Location("new"); location.setLatitude(position.latitude); location.setLongitude(position.longitude); LocationRepostiory locationRepostiory = new LocationRepostiory(context, location); locationRepostiory.getLastLocation(). observeOn(SchedulerProvider.getInstance().ui()). subscribeOn(SchedulerProvider.getInstance().computation()). subscribe(locationString -> { if(editTextAddress.length()==0){
Teks kelas LocationRepostiory di mana geocoding terbalik terjadi public class LocationRepostiory { private Context context; private Location location; public LocationRepostiory(Context context, Location location) { this.context = context; this.location = location; } public Single<String> getLastLocation() { return Single.create(this::subscribeOnLocation); } private void subscribeOnLocation(SingleEmitter<String> e) { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); String errorMessage = ""; List<Address> addresses = null; try {