2010-12-20 5 views
10

In meiner Kartenanwendung zeige ich eine Reihe von Überlagerungen auf einer Karte an. Immer, wenn ich tippe auf ein Overlay Ich brauche ein Popup angezeigt werden, wie dieseWie Popup beim Tippen auf Overlay in Android angezeigt werden?

Image of MapView with overlay popup

Kann jemand mir helfen, dies in Ordnung bringen zu?

+0

mögliche Duplikate von [Wie Pop-up auf Klick-Karten-Overlay angezeigt werden?] (Http://stackoverflow.com/questions/2379654/how-to-show-pop-up -on-click-map-overlay) –

+0

Diese Frage wurde bereits diskutiert. Finden Sie die Details [hier] (http://stackoverflow.com/questions/2379654/how-to-show-pop-up-on-clicking-map-overlay). – Sandy

+0

Ich habe gesehen, dass .it meine Zweifel nicht erfüllt, ich brauche ein Popup genau int Bild. – Srinivas

Antwort

8

Ja, es ist möglich, dass Sie unser Selbstinformationsfenster für Anzeigeinformation über Tap in der Karte entwerfen sollten Ich bin Liefercode für Sie, wenn Sie verstehen, dass Sie mich bitte wiederholen.

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; 
    } 


} 

In diesem Code habe ich eine Funktion Infofenster zeichnen entwerfen

+1

Code ist nicht verständlich können Sie bitte bearbeiten und fehlende Klassen eingeben? wie public MoreInformation myMoreInformation; öffentlichen PantryLocation Standort MapLocationViewer – UMAR

+0

Es ist zu lang, und nicht auf den Punkt. Ich hoffe, es wäre klarer. – Siddharth

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

map.addMarker(maropt); 

Karte ein Objekt von GoogleMap ist. Ich verwende hier Markierungen, um Pop-up-Fenster zu setzen

+0

Diese Frage wurde zu dem Zeitpunkt gestellt, als API V2 noch nicht existierte. Ich halte es nicht für sinnvoll, es im Kontext der neuen API wiederzubeleben. –