2010-12-20 114 views
10

在我的地圖應用程序中,我在地圖上顯示了一組覆蓋圖。每當我點擊上的覆蓋,我需要顯示彈出,這樣如何在android中點擊疊加層顯示彈出窗口?

Image of MapView with overlay popup

任何一個可以幫助我弄清楚這個?

+0

可能的重複[如何顯示點擊地圖疊加彈出?](http://stackoverflow.com/questions/2379654/how-to-show-popup -on-click-map-overlay) – 2012-08-10 18:18:00

+0

這個問題已經討論過了。找到詳細信息[這裏](http://stackoverflow.com/questions/2379654/how-to-show-pop-up-on-clicking-map-overlay)。 – Sandy 2010-12-20 05:47:28

+0

我已經看到了這一點。它不滿足我的疑問,我需要一個完全彈出的int圖像。 – Srinivas 2010-12-20 06:18:17

回答

8

是的,這是可能的,你應該設計我們的自我信息窗口顯示信息超過挖掘地圖我提供代碼給你,如果你明白,請重播我。

public class MapLocationOverlay extends Overlay { 

    private boolean isNameAddHold=true; 

    private Bitmap bitmap,bitCross,bitMoreInformation; 
    int testX,testY,count=0; 
    int infoWindowOffsetX,infoWindowOffsetY; 
    public String name,address,argName,argAddress,argid; 
    // Store these as global instances so we don't keep reloading every time 
    private Bitmap bubbleIcon, shadowIcon; 

    private MapLocationViewer mapLocationViewer; 
    double toLat, toLng; 

    private Paint innerPaint, borderPaint, textPaint; 
    private boolean isRemovePriorPopup=false; 
    private boolean temp=true,first=true, firstDraw = true; 
    public boolean tempDefaule=true; 
    public MoreInformation myMoreInformation; 
    public PantryLocation location; 

    // The currently selected Map Location...if any is selected. This tracks whether an information 
    // window should be displayed & where...i.e. whether a user 'clicked' on a known map location 
    private PantryLocation selectedMapLocation; 

    public MapLocationOverlay(MapLocationViewer mapLocationViewer,PantryLocation arglocation) { 

     this.mapLocationViewer = mapLocationViewer; 
     location=arglocation; 
     bubbleIcon = BitmapFactory.decodeResource(mapLocationViewer.getResources(),R.drawable.bubble); 
     shadowIcon = BitmapFactory.decodeResource(mapLocationViewer.getResources(),R.drawable.shadow); 
     bitmap = BitmapFactory.decodeResource(mapLocationViewer.getResources(),R.drawable.infowindow); 
     bitCross = BitmapFactory.decodeResource(mapLocationViewer.getResources(),R.drawable.crass); 
     bitMoreInformation = BitmapFactory.decodeResource(mapLocationViewer.getResources(),R.drawable.more_informations_new); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
     // TODO Auto-generated method stub 
     if (e.getAction() == 0) 
     { 
      this.tempDefaule=false; 
     } 
     if (e.getAction() == 1) 
     { 
      this.tempDefaule=false; 
     } 
     if (e.getAction() == 2) 
     { 
      this.tempDefaule=false; 
     } 
     return super.onTouchEvent(e, mapView); 
    }  

    @Override 
    public boolean onTap(GeoPoint p, MapView mapView) { 
     //this.tempDefaule=false; 
     // Store whether prior popup was displayed so we can call invalidate() & remove it if necessary. 

     // Next test whether a new popup should be displayed 

      selectedMapLocation = getHitMapLocation(mapView,p); 

      mapView.invalidate();  

     // Lastly return true if we handled this onTap() 
     return selectedMapLocation != null; 
    } 

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

     drawMapLocations(canvas, mapView, shadow); 
     //this.tempDefaule=false; 
     drawInfoWindow(canvas, mapView, shadow); 
     //this.tempDefaule=false; 
     } 

    /** 
    * Test whether an information balloon should be displayed or a prior balloon hidden. 
    */ 
    private PantryLocation getHitMapLocation(MapView mapView, GeoPoint tapPoint) { 

     // Track which MapLocation was hit...if any 
     PantryLocation hitMapLocation = null; 

     RectF hitTestRecr = new RectF(); 
     Point screenCoords = new Point(); 
     ArrayList<PantryLocation> iterator =mapLocationViewer.getMapLocations(); 
     for(int i=0;i<iterator.size();i++) {  
      PantryLocation testLocation = iterator.get(i); 

      // Translate the MapLocation's lat/long coordinates to screen coordinates 
      mapView.getProjection().toPixels(testLocation.getPoint(), screenCoords); 

      // Create a 'hit' testing Rectangle w/size and coordinates of our icon 
      // Set the 'hit' testing Rectangle with the size and coordinates of our on screen icon 
      hitTestRecr.set(-bubbleIcon.getWidth()/2,-bubbleIcon.getHeight(),bubbleIcon.getWidth()/2,0); 
      hitTestRecr.offset(screenCoords.x,screenCoords.y); 

      // Finally test for a match between our 'hit' Rectangle and the location clicked by the user 
      mapView.getProjection().toPixels(tapPoint, screenCoords); 
      //hitMapLocation = testLocation; 
      if (hitTestRecr.contains(screenCoords.x,screenCoords.y)) { 
       hitMapLocation = testLocation; 
       first = true; 
       isNameAddHold = true; 
       break; 
      } 
     } 
     testX=(int)screenCoords.x; 
     testY=(int)screenCoords.y; 
     // Lastly clear the newMouseSelection as it has now been processed 
     tapPoint = null; 
     if(hitMapLocation==null && selectedMapLocation!=null) 
     return selectedMapLocation; 

     return hitMapLocation; 

    } 

    private void drawMapLocations(Canvas canvas, MapView mapView, boolean shadow) { 
     int i=0;count++; 
     ArrayList<PantryLocation> iterator =mapLocationViewer.getMapLocations(); 
     Point screenCoords = new Point(); 
     for(i=0;i<iterator.size();i++) {  
      PantryLocation location = iterator.get(i); 
      mapView.getProjection().toPixels(location.getPoint(), screenCoords); 
      //mapView.getController().setCenter(location.getPoint()); 
      if (shadow) { 
       // Only offset the shadow in the y-axis as the shadow is angled so the base is at x=0; 
       canvas.drawBitmap(shadowIcon, screenCoords.x, screenCoords.y - shadowIcon.getHeight(),null); 
      } else { 
       canvas.drawBitmap(bubbleIcon, screenCoords.x - bubbleIcon.getWidth()/2, screenCoords.y - bubbleIcon.getHeight(),null); 
      } 

     } 
//  if(i==iterator.size()){ 
//   this.tempDefaule=false;} 
if(tempDefaule==true) 
{ 

      PantryLocation location1 = this.location; 
      //mapView.getProjection().toPixels(location.getPoint(), screenCoords); 
      Point screenCoord = new Point(); 
      mapView.getController().setCenter(location1.getPoint()); 
      mapView.getController().setZoom(15); 
     // tempDefaule=false; 
       //mapView.getController().setCenter(location.getPoint()); 

     } 

      //tempDefaule=false;  
}   //mapView.getProjection().toPixels(location.getPoint(), screenCoord); 
      //canvas.drawBitmap(bubbleIcon, screenCoord.x - bubbleIcon.getWidth()/2, screenCoord.y - bubbleIcon.getHeight(),null); 
      //mapView.invalidate(); 


    private void drawInfoWindow(Canvas canvas, MapView mapView, boolean shadow) { 
     //this.tempDefaule=false; 
     if (selectedMapLocation != null) { 
      if (shadow) { 
       // Skip painting a shadow in this tutorial 
      } else { 
       // First determine the screen coordinates of the selected MapLocation 
       isRemovePriorPopup=true; 
       Point selDestinationOffset = new Point(); 
       mapView.getProjection().toPixels(selectedMapLocation.getPoint(), selDestinationOffset); 

       // Setup the info window with the right size & location 
       int INFO_WINDOW_WIDTH = 125; 
       int INFO_WINDOW_HEIGHT = 25; 
       RectF infoWindowRect = new RectF(0,0,100,20); 
       RectF closeRect = new RectF(0,0,20,20); 
       infoWindowOffsetX = selDestinationOffset.x-INFO_WINDOW_WIDTH/2; 
       infoWindowOffsetY = selDestinationOffset.y-INFO_WINDOW_HEIGHT-bubbleIcon.getHeight(); 
       infoWindowRect.offset(infoWindowOffsetX+95,infoWindowOffsetY-45); 
       closeRect.offset(infoWindowOffsetX+160,infoWindowOffsetY-90); 
       Paint myPaintBlack=new Paint(); 
        Paint myPaintWhite=new Paint(); 

        myPaintWhite.setARGB(255, 255, 255, 255); 


       // Draw inner info window 
       canvas.drawRoundRect(infoWindowRect, 5, 5, getInnerPaint()); 

       // Draw border for info window 
       canvas.drawRoundRect(infoWindowRect, 5, 5, getBorderPaint()); 

       // Draw the MapLocation's name 


       myPaintBlack.setColor(Color.BLACK); 
       myPaintBlack.setTextSize(20); 

       canvas.drawBitmap(bitmap, infoWindowOffsetX-50, infoWindowOffsetY-100,getInnerPaint()); 
       if(isNameAddHold) 
       { 
       argid=selectedMapLocation.getID(); 
       argName=selectedMapLocation.getName(); 
       name=selectedMapLocation.getName(); 
       toLat = selectedMapLocation.getLatitude(); 
       toLng = selectedMapLocation.getLongitude(); 
       if(name.length()>18) 
       name=selectedMapLocation.getName().substring(0,18)+".."; 
       argAddress=selectedMapLocation.getAddress(); 
       address=selectedMapLocation.getAddress(); 
       if(address.length()>30) 
       address=selectedMapLocation.getAddress().substring(0,30)+".."; 
       } 
       canvas.drawText(name,infoWindowOffsetX-45,infoWindowOffsetY-70,myPaintBlack); 
       myPaintBlack.setTextSize(13); 
       canvas.drawText(address,infoWindowOffsetX-45,infoWindowOffsetY-55,myPaintBlack); 

      // Draw inner info window 
       canvas.drawRoundRect(infoWindowRect, 5, 5, getInnerPaint()); 

       // Draw border for info window 
       canvas.drawRoundRect(infoWindowRect, 5, 5, getBorderPaint()); 
       // Draw the MapLocation's name 
       myPaintBlack.setColor(Color.CYAN); 
       myPaintBlack.setTextSize(11); 
       //canvas.drawText("Click for more info..",infoWindowOffsetX+105,infoWindowOffsetY-33,myPaintBlack); 
       canvas.drawBitmap(bitMoreInformation, infoWindowOffsetX+95, infoWindowOffsetY-45,getInnerPaint()); 
       //canvas.drawBitmap(bitCross, infoWindowOffsetX+160, infoWindowOffsetY-90,getInnerPaint()); 

      } 
     } 
     if(isRemovePriorPopup) 
     { 
     if(((testX>(infoWindowOffsetX+95)&&testX<(infoWindowOffsetX+195)))&&(testY>(infoWindowOffsetY-45)&&testY<(infoWindowOffsetY-25))) 
      { 
      if(temp){ 
       try 
       { 
        temp=false; 
        isNameAddHold=false; 
       isRemovePriorPopup=false; 
       Context context=mapLocationViewer.cn; 
       Toast.makeText(context, "Loading...", Toast.LENGTH_SHORT).show(); 
       Intent intent=new Intent(context, MoreInformation.class); 
       intent.putExtra("Id",argid); 
       intent.putExtra("Name",argName); 
       intent.putExtra("Address",argAddress); 
       intent.putExtra("Latitude",toLat); 
       intent.putExtra("Longitude",toLng); 

       context.startActivity(intent); 

       } 
       catch (Exception ex) 
       { 
        Log.d("Redirected Error :", ex.getMessage()); 
       } 
     //canvas.drawText("This is for Testing",testX,testY,myPaintBlack); 
      }} 
      else if(((testX>(infoWindowOffsetX+160)&&testX<(infoWindowOffsetX+180)))&&(testY>(infoWindowOffsetY-90)&&testY<(infoWindowOffsetY-70))) 
      { 

       if(isRemovePriorPopup) 
       { 
       isRemovePriorPopup=false;     
       selectedMapLocation=null; 
       draw(canvas, mapView, shadow); 
       // mapLocationViewer.setDZoom(); 
       } 

      } 
     } 
    } 

    public Paint getInnerPaint() { 
     if (innerPaint == null) { 
      innerPaint = new Paint(); 
      innerPaint.setARGB(225, 75, 75, 75); //gray 
      innerPaint.setAntiAlias(true); 
     } 
     return innerPaint; 
    } 

    public Paint getBorderPaint() { 
     if (borderPaint == null) { 
      borderPaint = new Paint(); 
      borderPaint.setARGB(255, 255, 255, 255); 
      borderPaint.setAntiAlias(true); 
      borderPaint.setStyle(Style.STROKE); 
      borderPaint.setStrokeWidth(2); 
     } 
     return borderPaint; 
    } 

    public Paint getTextPaint() { 
     if (textPaint == null) { 
      textPaint = new Paint(); 
      textPaint.setARGB(255, 255, 255, 255); 
      textPaint.setAntiAlias(true); 
     } 
     return textPaint; 
    } 


} 

在此代碼我有設計的函數繪製信息窗口

+1

代碼是不可理解的,你可以編輯並輸入缺失的類嗎?像公衆更多的信息myMoreInformation; 公共PantryLocation位置; MapLocationViewer – UMAR 2011-04-16 11:24:16

+0

它太長,而不是重點。我希望它會更清晰。 – Siddharth 2012-12-13 03:21:56

2
MarkerOptions maropt=new MarkerOptions() 
    .position(new LatLng(lati, longi)) 
    .snippet("any text") 
      .title("set title here"); 

map.addMarker(maropt); 

地圖是GoogleMap的的對象。我在這裏使用標記設置彈出窗口

+0

在API v2時間不存在這個問題。我認爲在新的API環境中重新使用它是沒有道理的。 – 2013-05-30 20:50:30