2010-12-20 14 views
10

En mi aplicación de mapa, estoy mostrando un conjunto de superposiciones en un mapa. Siempre que pulsar en una superposición que necesito para mostrar una ventana emergente, como este¿Cómo mostrar ventana emergente al tocar superposición en android?

Image of MapView with overlay popup

Puede alguien ayudarme a resolver esto?

+0

posible duplicado de [¿Cómo mostrar la ventana emergente al hacer clic en la superposición de mapa?] (Http://stackoverflow.com/questions/2379654/how-to-show-pop-up -on-click-map-overlay) –

+0

Esta pregunta ya ha sido discutida. Encuentre los detalles [aquí] (http://stackoverflow.com/questions/2379654/how-to-show-pop-up-on-clicking-map-overlay). – Sandy

+0

He visto que. Sin cumplir mi duda, necesito una imagen emergente exactamente int. – Srinivas

Respuesta

8

Sí, es posible que debas diseñar nuestra ventana de autoinformación para mostrar información sobre tocar en el mapa. Tengo un código de suministro para ti si entiendes que por favor vuelve a reproducirme.

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


} 

En este código que tengo diseñar una función dibujar infowindow

+1

código no es comprensible ¿puede por favor editar e ingresar clases faltantes? como público MoreInformation myMoreInformation; ubicación de PantryLocation público; MapLocationViewer – UMAR

+0

Es demasiado largo, y no al punto. Espero que sea más claro. – Siddharth

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

map.addMarker(maropt); 

mapa es un objeto de GoogleMap. Estoy usando aquí marcadores para configurar la ventana emergente

+0

Esta pregunta se realizó en el momento en que API v2 no existía. No creo que tenga sentido revivirlo en el contexto de la nueva API. –

Cuestiones relacionadas