I've found a workaround for this issue that works like a charm at least for me. The idea: Set the anchor point of the icon of the marker the desired amount of millimeters/inches below the icon. This moves up the icon to the preferred position. But doing so, you have to offset the latitude of the marker by the appropriate amount of degrees. The formula I use to calculate degrees from millimeters works for all locations and zoom levels of the map, but the constant factor (80) depends on the size of the icon you use, of course on your anchor point, and most probably on the resolution of the device. For me, this code does the job on my Galaxy S9:
mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
@Override public void onMarkerDragStart(Marker marker) {
marker.setAnchor(0.5f, 1.4f);
VisibleRegion vR = mMap.getProjection().getVisibleRegion();
View v = findViewById(R.id.map);
offset = 80*(vR.latLngBounds.northeast.latitude - vR.latLngBounds.southwest.latitude)/v.getLayoutParams().height;
}
@Override public void onMarkerDrag(Marker marker) {
// Your code. Replace all 'marker.getPosition()' by 'new LatLng(marker.getPosition().latitude + offset, marker.getPosition().longitude)'
}
@Override public void onMarkerDragEnd(Marker marker) {
// Your code.
}
});