2010-12-13 4 views
7

Я пытаюсь повторить эту функцию Карт в Android: Custom Map OverlayСоздание пользовательского наложения на карте

Вы можете видеть, что на карте, есть круг, изображающий диапазон, который пользователь выбрал.

В моем приложении я также хочу, чтобы на периметре круга находился перетаскиватель, который можно перетащить, чтобы переопределить радиус.

Если кто-то может сказать мне, как рисовать пользовательские нарисованные накладки и 2D-графику по карте, я могу делать другие вещи самостоятельно.

Спасибо!

Полное применение может быть достигнуто на this link

+0

проверить эту библиотеку, он имеет именно такую ​​функциональность: https://github.com/i-schuetz/map_areas – Ixx

ответ

18

Хорошо, я пытался сделать что-то самостоятельно, и поставить этот код, чтобы получить вышеупомянутый эффект:

public class MarkerOverlay extends Overlay { 

    Geocoder geoCoder = null; 

    public MarkerOverlay() { 
     super(); 
    } 


    @Override 
    public boolean onTap(GeoPoint geoPoint, MapView mapView){ 
     selectedLatitude = geoPoint.getLatitudeE6(); 
     selectedLongitude = geoPoint.getLongitudeE6(); 
     return super.onTap(geoPoint,mapView); 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapV, boolean shadow){ 

     if(shadow){ 
      Projection projection = mapV.getProjection(); 
      Point pt = new Point(); 
      projection.toPixels(globalGeoPoint,pt); 

      GeoPoint newGeos = new GeoPoint(selectedLat+(100),selectedLong); // adjust your radius accordingly 
      Point pt2 = new Point(); 
      projection.toPixels(newGeos,pt2); 
      float circleRadius = Math.abs(pt2.y-pt.y); 

      Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

      circlePaint.setColor(0x30000000); 
      circlePaint.setStyle(Style.FILL_AND_STROKE); 
      canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); 

      circlePaint.setColor(0x99000000); 
      circlePaint.setStyle(Style.STROKE); 
      canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); 

      Bitmap markerBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.pin); 
      canvas.drawBitmap(markerBitmap,pt.x,pt.y-markerBitmap.getHeight(),null); 

      super.draw(canvas,mapV,shadow); 
     } 
    } 
} 

Это позволило мне иметь следующий эффект:

Effect on Map

Расчет может быть не то, что вы хотите.
Его просто для демонстрационных целей.
Для расчета реального диапазона/расстояния требуется также использование подшипника и имеет определенную формулу.
Сообщите мне, если у вас есть какие-либо вопросы относительно этого.

+0

Что такое выбранная долгота и долгота? где вы использовали значения широты, долготы? пожалуйста, руководство, я хочу реализовать то же самое. – UMAR

+0

и, пожалуйста, вставьте код его использования с карты google. как вы называете этот класс, любая помощь будет оценена по достоинству. – UMAR

+0

Извините, это широта/долгота, которую пользователь нажал. его глобальная переменная, которая сохраняет эти значения. Этот класс является внутренним классом моего «MapActivity» –

1

расширить класс ItemizedOverlay переопределить метод draw(). Canvas, где нарисованы оверлеи, передается этому методу, и вы можете позвонить drawCircle или что-нибудь, что необходимо для отображения вашего диапазона.

+0

Это хороший , но, как видно на изображении выше, мне нужно будет иметь точки, в которых сейчас находится маркер. сначала он даст мне geoPoints, и мне придется преобразовать их в формат экрана (координаты, такие как x, y), я ничего не могу для этого! : -/ –

+0

Проверьте это: http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html#getProjection%28%29 – ognian

+0

Прохладный. Я получил точки мыши. однако, поскольку я также использую метод onTap, чтобы поместить маркер в позицию, где пользователь нажимает, после переопределения метода draw() механизм onTap не работает. Потому что он использовал вызов метода draw() по умолчанию для размещения маркеров, который я переопределил сейчас. Любое решение этого !? –

0

Пример кода нарисовать булавку с окружностью:

public class MapDemoActivity extends MapActivity { 
    MapView mapView; 
    MapController mc; 
    GeoPoint p; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    View zoomView = mapView.getZoomControls(); 

    zoomLayout.addView(zoomView, 
     new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true); 

    mc = mapView.getController();   
    String coordinates[] = {"28.38", "77.12"}; 
    double lat = Double.parseDouble(coordinates[0]); 
    double lng = Double.parseDouble(coordinates[1]); 

    p = new GeoPoint(
     (int) (lat * 1E6), 
     (int) (lng * 1E6)); 

    mc.animateTo(p); 
    mc.setZoom(8); 
    //---Add a location marker--- 
    MapOverlay mapOverlay = new MapOverlay(); 
    List<Overlay> listOfOverlays = mapView.getOverlays(); 
    listOfOverlays.clear(); 
    listOfOverlays.add(mapOverlay);   
    mapView.invalidate(); 
    } 

    class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 
     //--------------draw circle----------------------    

     Point pt=mapView.getProjection().toPixels(p,screenPts); 

     Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     circlePaint.setColor(0x30000000); 
     circlePaint.setStyle(Style.FILL_AND_STROKE); 
     canvas.drawCircle(screenPts.x, screenPts.y, 50, circlePaint);   

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
      getResources(), R.drawable.pin);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-bmp.getHeight(), null);    
     super.draw(canvas,mapView,shadow); 

     return true; 

    } 
} 
@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 
} 
+0

HI manaco .. while running У меня есть некоторые сомнения в вашем коде. для функции масштабирования есть кнопка увеличения или любого? – NovusMobile

+0

@denny Я использовал средства управления увеличением в main.xml. См. Эту ссылку для получения дополнительной информации на карте [ссылка] (http://mobiforge.com/developing/story/using-google-maps-android) –

Смежные вопросы