2012-10-06 1 views
5

나는이 일 동안 내 머리를 꽉 쥐고 있었고 Google 검색 결과를 가지고 있지만보고 한 다른 사용자를 찾을 수없는 것 같습니다. 그러한 문제 (그것을 놓쳤을 수도 있음).Longpress의 Android Map Marker가 실제로 LongPressed 지역 아래에 표시됨 (API 15)

필자는 길쭉한 소리를 듣고 맵에서 마커를 그릴 때 사용하는 Mapview 클래스를 사용자 정의했습니다. API-8에서는 괜찮은 부분입니다. 그러나 API-15에서 마커는 사용자 손가락이 롱 프레스를 할 때 약 2cm 아래로 오프셋됩니다. 이것은 실제 디바이스 (samsung s2)와 Eclipse 에뮬레이터에서 모두 관찰됩니다. 또한 마커 영역 대 길게 눌러 진 손가락 영역 (약 2cm 오프셋)이 모든 줌 레벨에서 관찰됩니다.

여기 (어딘가에서 그것을 꼴) 내 맞춤지도보기 클래스입니다 :

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

그리고 이것은 내가 위의 클래스를 호출하는 방법이다 : 그것은 setBounds 문제처럼 보인다

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

나도 같은 문제에 직면 해있다. @ 마카, 솔루션을 찾은 다음 공유 해주세요 .... 미리 감사드립니다. –

+0

죄송합니다 @MukeshY 우리는이 문제를 모두 포기하고 코드를 통해지도에 고정 핀을 선택했습니다. –

답변

1

합니다. 마커 범위를 drawable의 오른쪽 하단 모서리에 가운데로 설정합니다. 그것이 의도 된 행동입니까?

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

행운 :

당신은에 경계를 설정 (가장 일반적인 유형 또는 마커 인) 하단 중앙에 중앙에 마커를 설정할 수 있습니다.

+0

고마워요. @ 루이스.하지만 해결책을 사용하면 여전히 같은 결과가 발생합니다. 나는 또한 대답을위한 나의 탐구에서 이러한 매개 변수를 변화 시키려고 노력했다. (미안하다는 것을 언급하는 것을 잊었다.) 또한 API 8을 사용하여 원래 설정에서 의도 한 동작을 얻고 있습니다. API 15에서이 동작이 현재 관찰되고 있습니다 (다른 버전에서는 시도하지 않았습니다). –

+0

드로어 블에 대해 서로 다른 두 경계를 설정하는 것과 동일한 동작을해서는 안됩니다. 똑같은 행동을하고 있다면 분명히 한계가 있습니다. 나는 유사한 문제에 대해보고 한 누군가를 기억한다. 전화를 한 후에 드로어 블의 경계가 사라졌지만, 그때에는 받아 들일만한 해결책이 없었다. – Luis

+0

오른쪽 @luis! CustomSitesOverlay 클래스의 설정으로 재정의되었습니다. 그러나 그것을 제거하고 실제 긴 보도 활동에 마커를 그렸던 barebones를 가지고 API 레벨 8 (HTC 장치) 및 약 2cm 오프셋 (마커는 2cm 아래에 그려 짐)에 대해 눌려진 영역에 마커를 올바르게 다시 놓고 있습니다. 영역 누름) API 레벨 15 (및 Samsung S2 장치). 2cm 오류는 모든 줌 레벨에서도 발생합니다. –