1

Google マップ API v2 を使用しています。マップのロング クリックにマーカーを配置します。マップの左側に設定した 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);
}   
4

2 に答える 2

2

あなたが投稿した答えに関して、私はより良い見方をしていると思います。
私はまったく同じことをやろうとしていました.私がやった方法は、アクティビティのレイアウトに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し、対応するメソッドをオーバーライドしました ( を設定した後GoogleMap.OnMarkerDragListener)。マーカーの画面座標 (lat、lng ではなく実際の x、y) を取得し、それらが重複しているかどうかを確認します (次のコードは 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 座標とイメージビューの間にオフセットがある可能性があり、これを考慮する必要があります。

于 2013-09-10T19:45:23.107 に答える
0

問題は部分的に解決しました、私はこれを試しました:

    LatLng markerLocation = marker.getPosition();
    LatLng mapCenter = map.getCameraPosition().target;

地図の中心に削除アイコンを配置すると、上記の 2 つのオブジェクトの緯度と経度の属性をテストできます。

    if((markerLocation.latitude > mapCenter.latitude - MINLAT  && markerLocation.longitude > mapCenter.longitude - MINLNG) 
            && (markerLocation.latitude < mapCenter.latitude + MAXLAT && markerLocation.longitude < mapCenter.longitude + MAXLNG)){
       marker.remove();
    }

編集 :

私のレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<fragment
    android:id="@+id/map"
    android:name="sn.gotech.trafficjammeu.TransparentSupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true"/>

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_delete_marker"
    android:layout_centerInParent="true"
    android:contentDescription="@string/app_name"
    android:visibility="gone"
    android:padding="10dp"
    android:id="@+id/deleteMarker"
    />

OnMarkerDragListenerオーバーライドされたメソッド:

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

@Override
public void onMarkerDragEnd(Marker marker) {
    // TODO Auto-generated method stub
    LatLng markerLocation = marker.getPosition();
    LatLng mapCenter = map.getCameraPosition().target;

    float[] results = new float[1];
    Location.distanceBetween(markerLocation.latitude,
            markerLocation.longitude, mapCenter.latitude,
            mapCenter.longitude, results);
    if (results[0] / 1000 < RADIUS) // the RADIUS depends on Camera Zoom
    {
        // ... remove marker here
    }
    deleteMarker.setVisibility(View.GONE);
}
于 2013-07-06T00:11:13.107 に答える