如何在谷歌地图上制作拖曳圆圈?

时间:2015-12-16 09:43:42

标签: android google-maps android-mapview

我使用Draggable Circle库在地图上绘制圆圈。它在我的地图上工作正常,但我想在地图上绘制用户选择的形状,如圆形,矩形或多边形。我想如果用户在地图上选择圆形图像,则应绘制圆形或其他圆形。我如何在地图上实现这一点,并且应该只有一个图像在地图上绘制,而不是多个圆形或其他。请帮我。

我的代码在这里

@Override
protected void onStart() {
    super.onStart();
    acti_drawingzone_clearTxt.setOnClickListener(this);
    acti_drawingzone_circleImg.setOnClickListener(this);
}

private AdapterView.OnItemClickListener mAutocompleteClickListener = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        final PlaceArrayAdapter.PlaceAutocomplete item = mPlaceArrayAdapter
                .getItem(position);
        final String placeId = String.valueOf(item.placeId);
        Log.i(LOG_TAG, "Selected: " + item.description);
        PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
                .getPlaceById(mGoogleApiClient, placeId);
        placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
        Log.i(LOG_TAG, "Fetching details for ID: " + item.placeId);
    }

};
private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback = new ResultCallback<PlaceBuffer>() {
    @Override
    public void onResult(PlaceBuffer places) {
        if (!places.getStatus().isSuccess()) {
            Log.e(LOG_TAG, "Place query did not complete. Error: "
                    + places.getStatus().toString());
            return;
        }
        // Selecting the first object buffer.
        final Place place = places.get(0);
        CharSequence attributions = places.getAttributions();
        queried_location = place.getLatLng();
         lattitude = queried_location.latitude;
         lngnitude = queried_location.longitude;

        CameraPosition SYDNEY = new CameraPosition.Builder()
                .target(new LatLng(lattitude, lngnitude)).zoom(11)
                .bearing(90).tilt(30).build();
        googleMap.animateCamera(CameraUpdateFactory
                .newCameraPosition(SYDNEY));

        googleMap.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.ic_map_color))
                .anchor(0.0f, 1.0f) // Anchors the marker on the bottom left
                .position(new LatLng(lattitude, lngnitude)));

    }

};

@Override
public void onClick(View arg0) {
    switch (arg0.getId()) {
    case R.id.acti_drawingzone_clearTxt:
        acti_drawingzone_autoTxt.setText("");
        break;
    case R.id.acti_drawingzone_circleImg:
        setupMap();
        break;
    default:
        break;
    }

}


@Override
public void onLocationChanged(Location arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnected(Bundle arg0) {
    mPlaceArrayAdapter.setGoogleApiClient(mGoogleApiClient);
    Log.i(LOG_TAG, "Google Places API connected.");

}

@Override
public void onConnectionSuspended(int arg0) {
    mPlaceArrayAdapter.setGoogleApiClient(null);
    Log.e(LOG_TAG, "Google Places API connection suspended.");
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.e(LOG_TAG, "Google Places API connection failed with error code: "
            + connectionResult.getErrorCode());

    Toast.makeText(
            this,
            "Google Places API connection failed with error code:"
                    + connectionResult.getErrorCode(), Toast.LENGTH_LONG)
            .show();

}

  @Override
    protected void onResume() {
        super.onResume();
        setupMap();
    }

   private void setupMap() {
    circleManager = new MapAreaManager(googleMap, 

        4, Color.RED, Color.HSVToColor(70, new float[] {1, 1, 200}), //styling 
        R.drawable.move, R.drawable.resize,0.5f, 0.5f, 0.5f, 0.5f, 

        new MapAreaMeasure(100, MapAreaMeasure.Unit.pixels), //circles will start with 100 pixels (independent of zoom level)

        new CircleManagerListener() { //listener for all circle events

            @Override
            public void onResizeCircleEnd(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on drag end circle: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCreateCircle(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on crate circle: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMoveCircleEnd(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on moved circle: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMoveCircleStart(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on move circle start: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onResizeCircleStart(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on resize circle start: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMinRadius(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on min radius: " + draggableCircle, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMaxRadius(MapAreaWrapper draggableCircle) {
                Toast.makeText(ActivityDrawingZone.this, "do something on max radius: " + draggableCircle, Toast.LENGTH_LONG).show();
            }
    });

    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lattitude, lngnitude), 6)); 
}

}

1 个答案:

答案 0 :(得分:1)

  • 创建一个微调器,其中包含用户将选择的圆形,矩形,多边形选项。
  • 用户选择其中一个形状后,使用Google提供的代码将其绘制到Google地图上。
  • 在将位于MapFragment顶部的视图上添加onTouchListener。
  • 侦听用户从下拉列表中选择的形状内部按下的事件。
  • 如果返回true表示用户已触及他/她选择的形状。
  • 将x,y转换为lat / lng值。
  • 在用户停止拖动圆圈并通过录制新的Lat / Lng将其固定到最终位置后获取新的Lat / Lng。