Я думаю, у меня есть лучшая перспектива в отношении ответа, который вы опубликовали.
Я пытался сделать то же самое, так как я сделал это, чтобы разместить ImageView в макете деятельности.
Когда вы нажимаете на маркер, телефон вибрирует в ближайшее время, и если вы перетащите маркер по изображению корзины, изображение станет красным. Когда вы прекращаете перетаскивание, если маркер находится поверх корзины, маркер удаляется, в противном случае он возвращается в исходное положение.
Мой код:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/customMapFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.myapp.CustomMapFragment" />
<ImageButton
android:id="@+id/ibDeleteMarker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_alignParentRight="true"
android:src="@drawable/ic_menu_delete"
android:layout_marginRight="8dp"
android:visibility="gone" />
</RelativeLayout>
(помещает значок удаления в средней/правой части экрана)
После этого я установил свой маркер, чтобы быть draggable
и я overidden соответствующие методы (после настройки значения GoogleMap.OnMarkerDragListener
). Я беру координаты экрана маркеров (фактические x, y, а не lat, lng), и я проверяю, перекрываются ли они (следующий код в моем MapFragment - в действии, в котором размещается фрагмент, я делаю необходимый findViewById и т. Д.):
//This is in the activity
deleteMarker = (ImageButton) findViewById(R.id.ibDeleteMarker);
//This is in the MapFragment
vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE);
//you need also the permission in AndroidManifest
@Override
public void onMarkerDragStart(Marker marker) {
((MainActivity) getActivity()).deleteMarker.setVisibility(View.VISIBLE);
origMarkerPos = marker.getPosition();
vibrator.vibrate(100);
}
@Override
public void onMarkerDrag(Marker marker) {
final ImageView deleteMarker = ((MainActivity) getActivity()).deleteMarker;
Point markerScreenPosition = getMap().getProjection().toScreenLocation(marker.getPosition());
if (overlap(markerScreenPosition, deleteMarker)) {
deleteMarker.setImageResource(R.drawable.ic_menu_delete_red);
} else {
deleteMarker.setImageResource(R.drawable.ic_menu_delete);
}
}
@Override
public void onMarkerDragEnd(Marker marker) {
final ImageView deleteMarker = ((MainActivity) getActivity()).deleteMarker;
deleteMarker.setVisibility(View.GONE);
Point markerScreenPosition = getMap().getProjection().toScreenLocation(marker.getPosition());
if (overlap(markerScreenPosition, deleteMarker)) {
marker.remove();
} else
marker.setPosition(origMarkerPos);
}
private boolean overlap(Point point, ImageView imgview) {
int[] imgCoords = new int[2];
imgview.getLocationOnScreen(imgCoords);
Log.e(TAG, " ****** Img x:" + imgCoords[0] + " y:" + imgCoords[1] + " Point x:" + point.x + " y:" + point.y + " Width:" + imgview.getWidth() + " Height:" + imgview.getHeight());
boolean overlapX = point.x < imgCoords[0] + imgview.getWidth() && point.x > imgCoords[0] - imgview.getWidth();
boolean overlapY = point.y < imgCoords[1] + imgview.getHeight() && point.y > imgCoords[1] - imgview.getWidth();
return overlapX && overlapY;
}
Я не знаю, если это лучшее решение, но оно работает.
Примечание: Если у вас есть панель действий, может быть смещение между координатой y маркера и изображением, которое вы должны будете принять во внимание.
Это зависит от того, используете ли вы mapview, mapfragment или supportmapfragment. Отправьте свой код, чтобы это не получилось. – yams
@MarkBasler Я использую mapfragment. Я разместил код! –