Custom Markers in Google Maps - android

I have built a music app and now I am trying to build a mapping feature more like Shazam's or Instagrams as follows:
Where initially, I am to drop a general marker on several points without actually showing all the activity in that location. Then on tapping that marker, the map will zoom in and other markers that are more specific will show, and so on..
Is there a tutorial available that I can follow the to achieve this effect in Android?

I have just found out that Google has a utility library that provides for marker clustering. The documentation can be found here https://developers.google.com/maps/documentation/android-api/utility/marker-clustering

You can create a method to add custom markers using this function:
private void drawCustomMarker(LatLng point) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(point);
markerOptions.title("SMS");
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.sms));
mMap.addMarker(markerOptions);
}
You can pass LatLng object where you want to drop the marker. I have used it in map click listener:
mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
#Override
public void onMapLongClick(LatLng newlatLng) {
drawCustomMarker(newlatLng);
}
});
Hope it will help you..!

Related

Cannot resolve symbol ItemizedOverlay

i got this error when i extends ItemizedOverlay on Activity. How can i resolve this error ? can any one help me out here.
ItemizedOverlay is no longer available in Google Maps v2.
If you would like to display marker on a map you can user Marker class. You can create Marker object using MarkerOptions.
I'm attaching the simplest example:
#Override
public void onMapReady(GoogleMap map) {
map.addMarker(new MarkerOptions()
.position(new LatLng(52.2330653, 20.9211106))
.title("Warsaw"));
}
In addition I recommend reading Google Maps Android API and Markers section.
You can make a marker draggable using:
MarkerOptions.draggable(boolean)
Marker.setDraggable(boolean)
You can also attach marker drag listener, you can find more here.

Google Maps remove marker route context menu

I started a new project with the Google Maps template of Android Studio and just added a marker to the map.
LatLng location = new LatLng(lat, lng);
Marker marker = mMap.addMarker(new MarkerOptions()
.position(location)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker)));
When I click the Marker there comes a little menu with a Google Maps icon on the bottom right corner:
How can I get rid of this thing? I couldn't find anything I even don't know how to call it but I really need to get rid of it.
You need to call setMapToolbarEnabled method of UiSettings
Like this:
#Override
public void onMapReady(GoogleMap googleMap) {
googleMap.getUiSettings().setMapToolbarEnabled(false);
// Do other staff
}

Display toolbar for Google Maps marker automatically

I have a marker and when I open the map it shows the marker. When I click on it it shows the title and a toolbar which includes two buttons on the bottom right of the map which let me launch intents to navigate to the marker or show it in google maps. I would like to have these displayed automatically when the map is opened rather than having the user to click on the marker.
Like this :-) ...
I can't seem to work out how to do this.
I have tried:
// create marker
MarkerOptions marker = new MarkerOptions().position(
new LatLng(latitude, longitude)).title("title");
// adding marker
googleMap.addMarker(marker).showInfoWindow();
googleMap.getUiSettings().setMapToolbarEnabled(true);
But this just shows the marker title and a button on the top right to go to my location not the two toolbar intent buttons on the bottom right.
Like this :-( ...
I'm a bit stuck any ideas?
The overlay that appears when a marker is clicked, is created and destroyed on-the-spot implicitly. You can't manually show that (yet).
If you must have this functionality, you can create an overlay over your map with 2 ImageViews, and call appropriate intents when they're clicked:
// Directions
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(
"http://maps.google.com/maps?saddr=51.5, 0.125&daddr=51.5, 0.15"));
startActivity(intent);
// Default google map
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(
"http://maps.google.com/maps?q=loc:51.5, 0.125"));
startActivity(intent);
Note: you need to change the coordinates based on Marker's getPosition() and the user's location.
Now to hide the default overlay, all you need to do is return true in the OnMarkerClickListener. Although you'll lose the ability to show InfoWindows and center camera on the marker, you can imitate that simply enough:
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
#Override
public boolean onMarkerClick(Marker marker) {
marker.showInfoWindow();
mMap.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition()));
return true;
}
});
I added a feature request here:
http://code.google.com/p/gmaps-api-issues/issues/detail?id=7652
Quoting the doc:
In a lite-mode map, the toolbar persists independently of the user's
actions. In a fully-interactive map, the toolbar slides in when the
user taps a marker and slides out again when the marker is no longer
in focus.
Seeems like there is no way to persist the toolbar in your case since its an interactive map. You might want to try using lite-mode if that is a requirement:
https://developers.google.com/maps/documentation/android/lite
Also looking at your code:
// create marker
MarkerOptions marker = new MarkerOptions().position(
new LatLng(latitude, longitude)).title("title");
// adding marker
googleMap.addMarker(marker).showInfoWindow();
googleMap.getUiSettings().setMapToolbarEnabled(true);
The very last line: googleMap.getUiSettings().setMapToolbarEnabled(true); is redundant unless you are explicitly setting it to false beforehand. The doc states:
Sets the preference for whether the Map Toolbar should be enabled or
disabled. If enabled, users will see a bar with various
context-dependent actions, including 'open this map in the Google Maps
app' and 'find directions to the highlighted marker in the Google Maps
app'.
By default, the Map Toolbar is enabled.
The link: https://developer.android.com/reference/com/google/android/gms/maps/UiSettings.html#setMapToolbarEnabled(boolean)
Hope this helps.
if i'm not mistaken you want to show the two buttons that related to the marker on the right botton side of the map and those buttons has some dependency to the marker if i'm true so you just need tu implement a new method like code below and just call this method on create and sure in your marker click listener
#Override
public void markerIntentButtonShow(Marker marker) {
//setvisible(true) to your side buttons or call some Intent
Intent i = new Intent(getActivity(), MarkerViewDetails.class);
i.putExtra("marker_snippet", marker.getSnippet());
startActivity(i);
}
and call the method in your click listener
googleMap
.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
#Override
public void onInfoWindowClick(Marker marker) {
markerIntentButtonShow(marker);
}
});
and in your onCreateView
MarkerOptions marker = new MarkerOptions().position(
new LatLng(latitude, longitude)).title("title");
googleMap.addMarker(marker).showInfoWindow();
markerIntentButtonShow(marker);
I had a similar issue..... if you are okay with not letting the user browse in the map and just focus on your marker, you can use lite-mode map....
Quote from documentation
In a lite-mode map, the toolbar persists independently of the user's actions. In a fully-interactive map, the toolbar slides in when the user taps a marker and slides out again when the marker is no longer in focus.
Again from docs
Also by default when a user taps the map, the API starts the Google Maps mobile app. You can override this by using GoogleMap.setOnMapClickListener() to set your own listener. You can also disable click events on the map, by calling setClickable() on the view that contains the MapView or MapFragment.
For the toolbar you have outlined in red, you can disable it using the setMapToolbarEnabled() method in UISettings
From the documentation:
Sets the preference for whether the Map Toolbar should be enabled or
disabled. If enabled, users will see a bar with various
context-dependent actions, including 'open this map in the Google Maps
app' and 'find directions to the highlighted marker in the Google Maps
app'.
Code example to disable the two buttons:
//Disable Map Toolbar:
mMap.getUiSettings().setMapToolbarEnabled(false);
Just in case you were also wondering about the zoom buttons, you can disable them like this:
mMap.getUiSettings().setZoomControlsEnabled(false);
Show a DialogFragment instead of the info window and handle everything in it.
#Override
public boolean onMarkerClick(Marker marker) {
FragmentManager fm = getSupportFragmentManager();
DialogFragment markerWebView = DialogFragment();
mMap.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition()));
markerWebView.show(fm, "fragment_marker");
return true;
}
OR
use the marker clicks to turn an overlay on/off using a facsimile of a Google map button
mMap.setOnMarkerClickListener(this);
mMap.setOnInfoWindowClickListener(this);
#Override
public boolean onMarkerClick(Marker marker) {
//here turn on the overlays for nav turns etc. for this marker.
return false
}
#Override
public void onInfoWindowClick(Marker marker) {
//here turn off the overlays for nav turns etc.
marker.hideInfoWindow();
}

Show InfoWindow of point on map long press

Using the Google Maps app as an example for what I mean, when you long press on the map it loads the closest address in an InfoWindow.
How can I display an InfoWindow on the position of the map that I just long pressed on without putting down a marker?
My guess is that Google Maps app adds a marker with 1x1px transparent bitmap (or maybe even 0x0px).
To detect onMapLongClick:
Implement OnMapLongClickListener
Call myMap.setOnMapLongClickListener(this) to register.
Override onMapLongClick(LatLng point) to add marker by calling
myMap.addMarker(new MarkerOptions().position(point).title("title")).
#Override
public void onMapLongClick(LatLng point) {
tvLocInfo.setText("New marker added#" + point.toString());
myMap.addMarker(new MarkerOptions().position(point).title(point.toString()));
}
Here is an example for that. Check here
When you've created the marker it's easy to add an infowindow to that marker and open it.

Android Google Maps v2 permanent Marker InfoWindow

The default behavior for an InfoWindow is to hide if the map the marker is in, or the marker itself are tapped.
Is there any way to make the InfoWindow permanent so you can't hide it?
I have disabled all gestures in the map, but the InfoWindow still disappears when you tap.
visceralG's solution is what I would do in the first place, but there is also (untested) alternative:
keep a reference to marker showing info window (from getInfoContents)
in onMapClick call markerShowingInfoWindow.showInfoWindow() to force it back
if the above doesn't work, put markerShowingInfoWindow.showInfoWindow() inside Runnable.run() and post it with Handler or View
Not that I'm aware of. You're best bet is to create your own custom icon for the map marker that includes a drawn "infoWindow." It will then require some custom drawing on the infoWindow section of the icon bitmap to produce the same effect as a normal infoWindow, but it's not too terrible to pull off. Not quite as easy as the solution you were looking for, but it'll get you where you were wanting to go. Hope that helps!
Assuming that you already know how to setup info windows, these lines will make your infoWindow, for any one marker, permanent:
final Marker myMarker = mGoogleMap.addMarker(mDriverMarker);
myMarker.showInfoWindow();
mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
#Override
public void onMapClick(LatLng latLng) {
myMarker.showInfoWindow();
}
});
mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
#Override
public boolean onMarkerClick(Marker marker) {
myMarker.showInfoWindow();
return true;
}
});

Categories

Resources