android - 在 ImageView 边界上拖动时删除 map 标记

标签 android android-maps-v2

我正在使用 google map api v2。我在 map 上放置标记长按,我想在拖过我在 map 左侧设置的 android“ic_delete”可绘制边界时删除它们(就像我们在启动器中删除应用程序时所做的那样)。帮助 !

这是我的代码:

    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    markers = new ArrayList<Marker>();
    boolean mReturn = false;
    if (map != null) {
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        mapSettings = map.getUiSettings();
        mapSettings.setCompassEnabled(true);
        mapSettings.setRotateGesturesEnabled(true);
        mapSettings.setZoomControlsEnabled(true);
        map.setMyLocationEnabled(true);


        map.setOnMapLongClickListener(this);
        map.setOnMarkerDragListener(this);
        mReturn = true;
    }


    @Override
    public void onMapLongClick(LatLng position) {
    // TODO Auto-generated method stub

    final LatLng point = position;

    Marker marker = map.addMarker(createMarkerOptions("test", "snippet", point, true));
    markers.add(marker);

    // ... 
}

    @Override
public void onMarkerDrag(Marker marker) {
    // TODO Auto-generated method stub

}

@Override
public void onMarkerDragEnd(Marker marker) {
    // TODO Auto-generated method stub
    ImageView deleteMarker = (ImageView) findViewById(R.id.deleteMarker); 
    deleteMarker.setVisibility(View.GONE);

        // I want to delete that "marker" if dragged over the "deleteMarker" imageview

}

@Override
public void onMarkerDragStart(Marker marker) {
    // TODO Auto-generated method stub
    findViewById(R.id.deleteMarker).setVisibility(View.VISIBLE);
}   

最佳答案

我想我对您发布的答案有更好的看法。
我试图做完全相同的事情,我这样做的方式是在 Activity 的布局中放置一个 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>

(将删除图标放在屏幕的中间/右侧)

之后,我将我的标记设置为可拖动,并且覆盖了相应的方法(在设置GoogleMap.OnMarkerDragListener 之后)。我采用标记屏幕坐标(实际的 x、y 而不是纬度、经度)并检查它们是否重叠(以下代码在我的 MapFragment 中 - 在承载 fragment 的 Activity 中我执行所需的 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 坐标之间可能存在偏移您必须考虑的标记和 ImageView 。

关于android - 在 ImageView 边界上拖动时删除 map 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460315/

相关文章:

android - 通过联系人姓名获取电话号码

android - edittext 中相同提示的多个提示或多个样式

java - 是否有用于 XMPP 客户端的 Android native 库?

Android谷歌地图显示空白

android - 谷歌地图 android API V2 崩溃

android - 膨胀谷歌地图 v2 fragment 导致 ClassNotFoundException/应用程序 LBS 意外停止

javascript - cordova应用程序可以调用android特定操作

android - 如何以编程方式获取相对的宽度和高度 - android中的线性布局?

带有来自 url 的动态图像的 Android map 标记图钉

java - Android map v2 仅在首次推出时有效