web-dev-qa-db-ja.com

Androidマーカーのドラッグアンドドロップをどのように実装しますか?

こんにちは? AndroidのMapViewアプリに取り組んでいます。 Google Map APIのgetlocation-functionを後で使用できるようにしたい3つのマーカーがあります。それを試すために、ドラッグアンドドロップ機能でマーカーを動かして、位置を確認したいと思います。

ドラッグアンドドロップでAndroidマーカーで作業するか、それを理解する方法を知っている人はいますか?

/ AK

27
kakka47

これはサンプルプロジェクトです から 私の本の1つ AndroidのGoogleマップ上のマーカーのドラッグアンドドロップ動作を示しています。

簡単に言えば、onTouchEvent()を使用して、ユーザーがマーカーの近くで指に触れて保持したことを検出します。次に、オーバーレイからマーカーを削除しますが、RelativeLayoutを使用して同じ画像をマップの上に配置します。次に、「移動」タッチイベントで、画像が移動されます(オーバーレイ全体を強制的に再描画するよりも高速です)。指を離すと画像は削除されますが、マーカーはオーバーレイの新しい場所に戻されます。

25
CommonsWare

Googleマップを実装するAndroid API v2、これを参照してください: https://developers.google.com/maps/documentation/Android/ およびGoogleMapオブジェクトsetOnMarkerDragListenerに設定します。例:

map.setOnMarkerDragListener(new OnMarkerDragListener() {
        @Override
        public void onMarkerDragStart(Marker arg0) {
            // TODO Auto-generated method stub
            Log.d("System out", "onMarkerDragStart..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude);
        }

        @SuppressWarnings("unchecked")
        @Override
        public void onMarkerDragEnd(Marker arg0) {
            // TODO Auto-generated method stub
            Log.d("System out", "onMarkerDragEnd..."+arg0.getPosition().latitude+"..."+arg0.getPosition().longitude);

            map.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition()));
        }

        @Override
        public void onMarkerDrag(Marker arg0) {
            // TODO Auto-generated method stub
            Log.i("System out", "onMarkerDrag...");
        }
    });

//Don't forget to Set draggable(true) to marker, if this not set marker does not drag.

map.addMarker(new MarkerOptions()
    .position(crntLocationLatLng)
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_my_location))
    .draggable(true));
45
UrMi

MapsV2の場合。 Googleマップイベントを使用します。自分で書いてはいけません。

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                mVisitingMarker.setPosition(latLng);
                mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
            }
        });

        mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
            @Override
            public void onMarkerDragStart(Marker arg0) {
            }

            @SuppressWarnings("unchecked")
            @Override
            public void onMarkerDragEnd(Marker arg0) {
               Log.d("System out", "onMarkerDragEnd...");
                mMap.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition()));
            }

            @Override
            public void onMarkerDrag(Marker arg0) {
            }
        });
4
F.O.O

CommonsWareのドラッグアンドドロップの素晴らしい機能が少し最適化されていることがわかりました。

私はマップ上のマーカーを使っていくつかの正確な測定を行っていました。マーカーが正確に正確に測定できるように、指で触れたり指を離したりした場所にマーカーを正確に配置したかったのです。

CommonsWareのオリジナルでは、マーカーの「近く」をタッチすると、マーカーはその正確なポイントに移動せず、指の動きに合わせて移動します。 ACTION_DOWN、ACTION_MOVE、ACTION_UPの指の真下にマーカーを表示する必要がありました。

誰かがそれを必要とする場合のコードは次のとおりです。この機能を作るためにCommonsWareに感謝しなければなりません、それは本当に良い考えです。

これは私が変更したコードの一部です。

私のMapViewはmapaです。

        @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {

        final int action=event.getAction();
        final int x=(int)event.getX();
        final int y=(int)event.getY();
        boolean result=false;

              if (action==MotionEvent.ACTION_DOWN) {
                for (OverlayItem item : mOverlays) {
                  Point p=new Point(0,0);

                  mapa.getProjection().toPixels(item.getPoint(), p);

                      //I maintain the hitTest's bounds so you can still
                      //press near the marker
                  if (hitTest(item, marker, x-p.x, y-p.y)) {
                    result=true;

                    inDrag=item;

                    mOverlays.remove(inDrag);
                    populate();

                        //Instead of using the DragImageOffSet and DragTouchOffSet
                        //I use the x and y coordenates from the Point
                    setDragImagePosition(x, y);

                    dragImage.setVisibility(View.VISIBLE);

                    break;
                  }
                }
              }
              else if (action==MotionEvent.ACTION_MOVE && inDrag!=null) {
                setDragImagePosition(x, y);

                result=true;
              }
              else if (action==MotionEvent.ACTION_UP && inDrag!=null) {
                dragImage.setVisibility(View.GONE);

                    //I get the geopoint without using any OffSet, directly with the 
                    //Point coordenates
                GeoPoint pt=mapa.getProjection().fromPixels(x,y);

                OverlayItem toDrop=new OverlayItem(pt, inDrag.getTitle(),
                                                   inDrag.getSnippet());
                orig = inDrag.getMarker(0);

                    //In my case I had down heading Arrows as markers, so I wanted my 
                    //bounds to be at the center bottom
                toDrop.setMarker(boundCenterBottom(orig));

                mOverlays.add(toDrop);
                populate();

                inDrag=null;
                result=true;
              }


           return(result || super.onTouchEvent(event, mapView));


    }

    private void setDragImagePosition(int x, int y) {
      RelativeLayout.LayoutParams lp=
        (RelativeLayout.LayoutParams)dragImage.getLayoutParams();

          //Instead of using OffSet I use the Point coordenates.
          //I want my arrow to appear pointing to the point I am moving, so 
          //I set the margins as the Point coordenates minus the Height and half the
          //width of my arrow.
      lp.setMargins(x-(dragImage.getWidth()/2),y-dragImage.getHeight(), 0, 0);
      dragImage.setLayoutParams(lp);
    }

これにより、矢印を押した場所に矢印が表示されます。矢印は元の場所から移動するのではありません。

1
Alex89Spain

ここ は、AndroidのMapviewのドラッグアンドドロップピンの完全なコードです

0
Ashok Domadiya