2012-01-17 52 views
1

我有關於谷歌地圖的問題。在mapview中鎖定氣球?

當我觸摸屏幕時,我在谷歌地圖中添加了銷釘,當我觸摸銷釘氣球被打開。從現在起一切都好。

我的問題是當我點擊氣球添加引腳也。

我不想這樣做。

如何鎖定這種情況?

這是截圖:

enter image description here

我的代碼:`公共無效AddPoint(可繪製可繪製的,MapView類MapView類,MotionEvent事件){

p = mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY()); 
    final MapController mc = mapView.getController(); 
    mc.setZoom(16); 
    CustomItemizedOverlay<CustomOverlayItem> itemizedOverlay = new CustomItemizedOverlay<CustomOverlayItem>(drawable, mapView); 

    itemizedOverlay.addOverlay(new CustomOverlayItem(p,"","","")); 
    mapView.getOverlays().add(itemizedOverlay); 
    mc.animateTo(p); 
    mapView.postInvalidate(); 

}` 

的onTap方法:`

package com.example; 



import android.graphics.drawable.Drawable; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup.LayoutParams; 
import com.google.android.maps.*; 

import java.util.List; 


public abstract class BalloonItemizedOverlay<Item extends OverlayItem> extends ItemizedOverlay<Item> { 

    private MapView mapView; 
    private BalloonOverlayView<Item> balloonView; 
    private View clickRegion; 
    private int viewOffset; 
    final MapController mc; 
    private Item currentFocussedItem; 
    private int currentFocussedIndex; 

    /** 
    * Create a new BalloonItemizedOverlay 
    * 
    * @param defaultMarker - A bounded Drawable to be drawn on the map for each item in the overlay. 
    * @param mapView - The view upon which the overlay items are to be drawn. 
    */ 
    public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) { 
     super(defaultMarker); 
     this.mapView = mapView; 
     viewOffset = 0; 
     mc = mapView.getController(); 
    } 

    /** 
    * Set the horizontal distance between the marker and the bottom of the information 
    * balloon. The default is 0 which works well for center bounded markers. If your 
    * marker is center-bottom bounded, call this before adding overlay items to ensure 
    * the balloon hovers exactly above the marker. 
    * 
    * @param pixels - The padding between the center point and the bottom of the 
    * information balloon. 
    */ 
    public void setBalloonBottomOffset(int pixels) { 
     viewOffset = pixels; 
    } 
    public int getBalloonBottomOffset() { 
     return viewOffset; 
    } 

    /** 
    * Override this method to handle a "tap" on a balloon. By default, does nothing 
    * and returns false. 
    * 
    * @param index - The index of the item whose balloon is tapped. 
    * @param item - The item whose balloon is tapped. 
    * @return true if you handled the tap, otherwise false. 
    */ 
    protected boolean onBalloonTap(int index, Item item) { 
     return false; 
    } 

    /* (non-Javadoc) 
    * @see com.google.android.maps.ItemizedOverlay#onTap(int) 
    */ 
    @Override 
    protected final boolean onTap(int index) { 

     currentFocussedIndex = index; 
     currentFocussedItem = createItem(index); 

     createAndDisplayBalloonOverlay(); 

     mc.animateTo(currentFocussedItem.getPoint()); 

     return true; 
    } 

    /** 
    * Creates the balloon view. Override to create a sub-classed view that 
    * can populate additional sub-views. 
    */ 
    protected BalloonOverlayView<Item> createBalloonOverlayView() { 
     return new BalloonOverlayView<Item>(getMapView().getContext(), getBalloonBottomOffset()); 
    } 

    /** 
    * Expose map view to subclasses. 
    * Helps with creation of balloon views. 
    */ 
    protected MapView getMapView() { 
     return mapView; 
    } 

    /** 
    * Sets the visibility of this overlay's balloon view to GONE. 
    */ 
    protected void hideBalloon() { 
     if (balloonView != null) { 
      balloonView.setVisibility(View.GONE); 
     } 
    } 

    /** 
    * Hides the balloon view for any other BalloonItemizedOverlay instances 
    * that might be present on the MapView. 
    * 
    * @param overlays - list of overlays (including this) on the MapView. 
    */ 
    private void hideOtherBalloons(List<Overlay> overlays) { 

     for (Overlay overlay : overlays) { 
      if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) { 
       ((BalloonItemizedOverlay<?>) overlay).hideBalloon(); 
      } 
     } 

    } 

    /** 
    * Sets the onTouchListener for the balloon being displayed, calling the 
    * overridden {@link #onBalloonTap} method. 
    */ 
    private OnTouchListener createBalloonTouchListener() { 
     return new OnTouchListener() { 

      float startX; 
      float startY; 

      public boolean onTouch(View v, MotionEvent event) { 

       View l = ((View) v.getParent()).findViewById(R.id.balloon_main_layout); 
       Drawable d = l.getBackground(); 

       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        int[] states = {android.R.attr.state_pressed}; 
        if (d.setState(states)) { 
         d.invalidateSelf(); 
        } 
        startX = event.getX(); 
        startY = event.getY(); 
        return true; 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        int newStates[] = {}; 
        if (d.setState(newStates)) { 
         d.invalidateSelf(); 
        } 
        if (Math.abs(startX - event.getX()) < 40 && 
          Math.abs(startY - event.getY()) < 40) { 
         // call overridden method 
         onBalloonTap(currentFocussedIndex, currentFocussedItem); 
        } 
        return true; 
       } else { 
        return false; 
       } 

      } 
     }; 
    } 

    /* (non-Javadoc) 
    * @see com.google.android.maps.ItemizedOverlay#getFocus() 
    */ 
    @Override 
    public Item getFocus() { 
     return currentFocussedItem; 
    } 

    /* (non-Javadoc) 
    * @see com.google.android.maps.ItemizedOverlay#setFocus(Item) 
    */ 
    @Override 
    public void setFocus(Item item) { 
     currentFocussedItem = item; 

     if (currentFocussedItem == null){ 
      hideBalloon(); 
     } 
     else{ 
      createAndDisplayBalloonOverlay(); 
     } 
    } 


    private boolean createAndDisplayBalloonOverlay(){ 
     boolean isRecycled; 
     if (balloonView == null) { 
      balloonView = createBalloonOverlayView(); 
      clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout); 
      clickRegion.setOnTouchListener(createBalloonTouchListener()); 
      isRecycled = false; 
     } else { 
      isRecycled = true; 
     } 

     balloonView.setVisibility(View.GONE); 

     List<Overlay> mapOverlays = mapView.getOverlays(); 
     if (mapOverlays.size() > 1) { 
      hideOtherBalloons(mapOverlays); 
     } 

     if (currentFocussedItem != null) 
      balloonView.setData(currentFocussedItem); 

     GeoPoint point = currentFocussedItem.getPoint(); 
     MapView.LayoutParams params = new MapView.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point, 
       MapView.LayoutParams.BOTTOM_CENTER); 
     params.mode = MapView.LayoutParams.MODE_MAP; 

     balloonView.setVisibility(View.VISIBLE); 

     if (isRecycled) { 
      balloonView.setLayoutParams(params); 
     } else { 
      mapView.addView(balloonView, params); 
     } 

     return isRecycled; 
    } 

} 
` 

回答

0

對於添加PIN,我認爲你使用覆蓋和你重用Overlay類的onDraw()和onTap()方法。你正在做onTap()方法的釘住和打開baloon。因此,鎖定句柄onTap()。並在引腳上打開氣球手柄點擊事件。

+0

Thx for reply我更新了我的問題。你能看看嗎? – DuyguK 2012-01-17 12:21:29