2012-10-06 29 views
5

我一直在爲這個日子絞盡腦汁,已經Google和SO'ed,但似乎無法找到其他人報告這樣的問題(可能錯過了)。Longpress上的Android地圖標記繪製在實際上已經很長時間的區域下(在API 15上)

我有一個自定義的Mapview類,用於監聽longpress,並使用它在我的地圖上繪製標記。它在API-8上繪製好了。但是在API-15上,標記偏移了用戶手指正在做longpress的地方以下約2cm。這對於實際設備(samsung s2)和eclipse仿真器都是可以觀察到的。在所有縮放級別上觀察到長時間按壓的手指區域與標記區域繪製(偏移約2cm)。

這是我定製的MapView類(從某處拽住它):

public class MyCustomMapView extends MapView { 
public interface OnLongpressListener { 
    public void onLongpress(MapView view, GeoPoint longpressLocation); 
} 

static final int LONGPRESS_THRESHOLD = 500; 
private GeoPoint lastMapCenter; 

private Timer longpressTimer = new Timer(); 
private MyCustomMapView.OnLongpressListener longpressListener; 


public MyCustomMapView(Context context, String apiKey) { 
    super(context, apiKey); 
} 

public MyCustomMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyCustomMapView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void setOnLongpressListener(MyCustomMapView.OnLongpressListener listener) { 
    longpressListener = listener; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    handleLongpress(event); 

    return super.onTouchEvent(event); 
} 

private void handleLongpress(final MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // Finger has touched screen. 
     longpressTimer = new Timer(); 
     longpressTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 

       GeoPoint longpressLocation = getProjection().fromPixels((int)event.getX(), (int)event.getY()); 

       /* 
       * Fire the listener. We pass the map location 
       * of the longpress as well, in case it is needed 
       * by the caller. 
       */ 
       longpressListener.onLongpress(MyCustomMapView.this, longpressLocation); 
      } 

     }, LONGPRESS_THRESHOLD); 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_MOVE) { 

     if (!getMapCenter().equals(lastMapCenter)) { 
      // User is panning the map, this is no longpress 
      longpressTimer.cancel(); 
     } 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_UP) { 
     // User has removed finger from map. 
     longpressTimer.cancel(); 
    } 

     if (event.getPointerCount() > 1) { 
        // This is a multitouch event, probably zooming. 
      longpressTimer.cancel(); 
     } 
} 

這就是我如何撥打以上級:

custom_marker = getResources().getDrawable(R.drawable.marker3); 
custom_marker.setBounds(-custom_marker.getIntrinsicWidth(), -custom_marker.getIntrinsicHeight(), 0, 0); 
customSitesOverlay = new CustomSitesOverlay(custom_marker); 
mapView.getOverlays().add(customSitesOverlay); 
customSitesOverlay.addOverlay(new OverlayItem(longpressLocation, "User Marker", id)); 
+0

我也面臨同樣的問題。 @Marka,你有沒有找到任何解決方案,然後請分享....在此先感謝 –

+0

對不起@MukeshY我們完全放棄了這個接近,並通過代碼選擇了一個固定的引腳。 –

回答

1

它看起來像一個的setBounds問題。您正在將標記邊界設置在繪圖的右下角的中心。這是行爲方式嗎?

您可以設置標誌在底部中心到中心(這是最常見的類型或標記)的範圍設定爲:

custom_marker.setBounds(-custom_marker.getIntrinsicWidth()/2, -custom_marker.getIntrinsicHeight(), custom_marker.getIntrinsicWidth()/2, 0); 

好運。

+0

謝謝@Luis,但使用您的解決方案仍然導致相同的行爲。我也嘗試了不同的這些參數以及我尋求答案的方式(忘記在帖子中提到遺憾)。此外,我正在使用API​​ 8獲得原始設置的預期行爲。它僅在API 15上表示目前觀察到此行爲(尚未在其他版本中嘗試過)。 –

+0

您不應該得到與爲drawable設置兩個不同邊界相同的行爲。如果你正在做同樣的行爲,你肯定會遇到一個界限問題。我記得有人報告過類似的問題,在一次活動結束後,可繪製的界限就失去了,但到那時還沒有任何解決方案被接受。 – Luis

+0

Right @luis!它正在被CustomSitesOverlay Class上的設置覆蓋。但試圖將其移除,並在實際的長按活動上進行準確的標記繪製,並且仍然返回按API Level 8(和HTC設備)按壓的區域上的標記的正確放置以及大約2cm偏移(標記繪製在2cm以下面積按下)API等級15(和三星S2設備)。 2cm錯誤也發生在所有縮放級別上。 –

相關問題