解决方法
是的,您可以通过点按地图设计我们的自助信息窗口来显示信息,如果您明白,请重播我,我将向您提供代码.
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,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,100,20); RectF closeRect = new RectF(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); // Draw inner info window canvas.drawRoundRect(infoWindowRect,5,getInnerPaint()); // Draw border for info window canvas.drawRoundRect(infoWindowRect,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,infoWindowOffsetY-55,myPaintBlack); // Draw inner info window canvas.drawRoundRect(infoWindowRect,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,myPaintBlack); }} else if(((testX>(infoWindowOffsetX+160)&&testX<(infoWindowOffsetX+180)))&&(testY>(infoWindowOffsetY-90)&&testY<(infoWindowOffsetY-70))) { if(isRemovePriorPopup) { isRemovePriorPopup=false; selectedMapLocation=null; draw(canvas,shadow); // mapLocationViewer.setDZoom(); } } } } public Paint getInnerPaint() { if ( innerPaint == null) { innerPaint = new Paint(); innerPaint.setARGB(225,75,75); //gray innerPaint.setAntiAlias(true); } return innerPaint; } public Paint getBorderPaint() { if ( borderPaint == null) { borderPaint = new Paint(); borderPaint.setARGB(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); textPaint.setAntiAlias(true); } return textPaint; } }