2011-08-03 15 views
0

私は非常にほとんど考えていないGPSトラッカーを開発中です。私はアプリ全体に関連するいくつかの質問があります。Googleマップアンドロイドでバブルを作成するのに問題がありますか?

  1. オーバーレイアイテムをタップするときにバブルを作成するにはどうすればよいですか? マップビューのクラスマップとオーバーレイアイテムの別のクラスを作成しています... 私のクラスマップで私は変化するGPS座標を受信するためにブロードキャスト受信機を使用しています。 それは良い記号ですか?
  2. GPSトラッカーアプリを作成するには、アプリの構造はどのようにする必要がありますか? (私たちは ためにそれを作成する方法が簡単であると周りのショーホットスポット、友人......のような多くの機能を持っている)

答えて

1

こんにちは、チェックアウトのGoogleマップ

中/バブルを情報ウィンドウに表示するには、このポストの答え
Its duplicate answer 

私は下に設けられているリンクから、また同じコード:

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


} 

How to display popup on tapping overlay in android?

関連する問題