2012-02-14 71 views
2

我使用類疊加到地圖上的標記地點..當我點擊地圖上的圖標(顯示atm_name和atm_address)時,我想要顯示地點的信息。 我嘗試了onTap方法,但是當我點擊時它顯示所有圖標的所有信息。 我應該使用哪種方法來解決我的問題。幫助我。 對不起,我用英語不好點擊圖標放置在地圖上的事件

我的代碼:

public class atm_markerATM extends Overlay{ 

    Double lat; 
    Double lng; 
    Context ct; 
    String atm_name; 
    String atm_address; 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     Projection projection = mapView.getProjection(); 
     if (shadow == false) { 
      Double latitude = lat*1E6; 
      Double longitude = lng*1E6; 
      GeoPoint geoPoint; 
      geoPoint = new GeoPoint(latitude.intValue(),longitude.intValue()); 

      // Convert the location to screen pixelats 
      Point point = new Point(); 
      projection.toPixels(geoPoint, point); 

      // Setup the paint 
      Paint paint = new Paint(); 

      Bitmap mBitmap = BitmapFactory.decodeResource(ct.getResources(), R.drawable.hoe); 
      canvas.drawBitmap(mBitmap, point.x-8, point.y-38, paint); 
     } 
     super.draw(canvas, mapView, shadow); 
    } 

    @Override 
    public boolean onTap(GeoPoint point, MapView mapView) { 
     return false; 
    } 

    public void setLocation(Double lat, Double lng, Context ct, String name, String address) { 
     this.lat = lat; 
     this.lng = lng; 
     this.ct = ct; 
     this.atm_name = name; 
     this.atm_address = address; 
    } 
} 

回答

2

我用OnTap中在我的疊加,它工作得很好。

在我的Draw方法中,我填充一個代表顯示實體(ATM的情況下)的對象的ArrayList。每個對象都有一個緯度和經度值。

在onTap中,我比較TapList和我的ArrayList中每個對象的緯度/長度(在Draw中填充)。如果水龍頭碰到物體附近的一個點,那麼我可以顯示它的細節。

我有一些源代碼,如果這聽起來像你想要去的方式,我可以在某些時候發佈。

[編輯]這裏是我已經破解了你需要的位的源代碼。請注意,有一些引用bubbleLayouts等,你不會需要,但它更容易讓他們進來。

請注意,總是有不止一種方法來做任何事情 - 這可能不是最好的的方式,但它爲我工作;-)

import java.util.ArrayList; 
import java.util.Iterator; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.graphics.RectF; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Projection; 
import com.google.android.maps.MapView.LayoutParams; 
import com.google.android.maps.Overlay; 

public class EnhancedStationOverlay extends Overlay { 

private MapView _mapView; 
private Context _context; 
private LinearLayout _bubbleLayout; 
private int _defaultMarker; 
private ArrayList<station> _stationLocations; 
private ArrayList<station> _displayedStations; 

// private RectF debugHitRect = new RectF(); 

public EnhancedStationOverlay(int defaultMarker, MapView mapView, LinearLayout bubbleLayout, ArrayList<station> stationList) { 
    _stationLocations = stationList; 
    _mapView = mapView; 
    _context = mapView.getContext(); 
    _bubbleLayout = bubbleLayout; 
    _defaultMarker = defaultMarker; 
} 

public boolean onTap(GeoPoint p, MapView mapView) { 

    station tappedStation = FetchTappedStation(mapView, p); 

    if (tappedStation != null) { 

     // Display Bubble containing Location Details 
    } 

    return true; 
} 

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

    Projection projection = mapView.getProjection(); 
    super.draw(canvas, mapView, shadow); 

    // Need to resolve top, bottom, left and right coordinates in relation to the map 

    // Height & Width 
    int latSpan = mapView.getLatitudeSpan(); 
    int lngSpan = mapView.getLongitudeSpan(); 

    // Centre Point 
    GeoPoint mapCenter = mapView.getMapCenter(); 

    // Left and Right 
    int mapLeftGeo = mapCenter.getLongitudeE6() - (lngSpan/2); 
    int mapRightGeo = mapCenter.getLongitudeE6() + (lngSpan/2); 

    // Top and Bottom 
    int mapTopGeo = mapCenter.getLatitudeE6() - (latSpan/2); 
    int mapBottomGeo = mapCenter.getLatitudeE6() + (latSpan/2); 

    if (shadow != false) { 
     // Create an empty ArrayList 
     _displayedStations = new ArrayList<station>(); 

     // Loop through stations 
     for (station currentStation : _stationLocations) { 

      // Resolve current station location to a GeoPoint 
      GeoPoint point = new GeoPoint((int) currentStation.getLatitude(), (int) currentStation.getLongitude()); 

      // Determine whether it falls within the screens view of the map 
      if ((point.getLatitudeE6() > mapTopGeo && point.getLatitudeE6() < mapBottomGeo) 
        && (point.getLongitudeE6() > mapLeftGeo && point.getLongitudeE6() < mapRightGeo)) { 

       // Yes it does - configure and place marker (pushpin) 
       Point myPoint = new Point(); 
       projection.toPixels(point, myPoint); 

       Bitmap stationMarker = BitmapFactory.decodeResource(_context.getResources(), _defaultMarker); 
       canvas.drawBitmap(stationMarker, myPoint.x - 15, myPoint.y - 30, null); 

       // Add this location to the collection of displayed locations 
       _displayedStations.add(currentStation); 
      } 
     } 
    } 
} 

private station FetchTappedStation(MapView mapView, GeoPoint geo) { 

    // As in Draw() - Need to resolve top, bottom, left and right coordinates in relation to the map (could refactor this) 
    int latSpan = mapView.getLatitudeSpan(); 
    int lngSpan = mapView.getLongitudeSpan(); 
    GeoPoint mapCenter = mapView.getMapCenter(); 
    int mapLeftGeo = mapCenter.getLongitudeE6() - (lngSpan/2); 
    int mapRightGeo = mapCenter.getLongitudeE6() + (lngSpan/2); 
    int mapTopGeo = mapCenter.getLatitudeE6() - (latSpan/2); 
    int mapBottomGeo = mapCenter.getLatitudeE6() + (latSpan/2); 

    // Track which MapLocation was hit…if any 
    station hitMapLocation = null; 

    RectF hitTestRecr = new RectF(); 
    Point screenCoords = new Point(); 
    Point tappedCoords = new Point(); 

    Iterator<station> iterator = _displayedStations.iterator(); 

    // Iterate over displayed stations... 
    while (iterator.hasNext()) { 
     station testLocation = iterator.next(); 

     // Translate MapLocation lat/long to screen coordinates 
     GeoPoint test = new GeoPoint((int) testLocation.getLatitude(), (int) testLocation.getLongitude()); 

     Projection projection = mapView.getProjection(); 
     projection.toPixels(test, screenCoords); 

     if (screenCoords.x != 0 && screenCoords.y != 0) { 
      // Create a 'hit testing' rectangle 
      hitTestRecr.set(-20, -50, 20, 15); 

      // Next, offset the Rectangle 'surround' current location’s 
      // icon on the screen. 
      hitTestRecr.offset(screenCoords.x, screenCoords.y); 

      // Finally test for match between ‘hit’ Rectangle and 
      // location clicked by the user. 
      // If a hit occurred, then we stop processing and return the 
      // result; 
      projection.toPixels(geo, tappedCoords); 
      if (hitTestRecr.contains(tappedCoords.x, tappedCoords.y)) { 
       hitMapLocation = testLocation; 
       break; 
      } 
     } 

    } 

    return hitMapLocation; 
} 

}

+0

是...是這樣我想去的地方。你可以給我代碼嗎?非常感謝 – HoangQBH 2012-02-14 15:44:35