2012-04-03 3 views
1

그래서 거의 똑같은 problem discussed in this post을 가지고 있습니다. 단, 간단하게 해결하기로 결정한 솔루션의 해킹 작업이 나를 위해 효과가 없을 것입니다. 나는 진짜 솔루션이 필요하다. 그래서 나는 안드로이드 맵 소스 코드를 역 설계하여 최상의 솔루션을 찾는다.Google Android지도에서 OverlayItem의 크기를 어떻게 제어합니까?

내 현재 해결 방법은 오버레이 항목을 확장하는 클래스의 그리기 메서드를 재정의하는 것입니다. 그런 다음지도의 오버레이 항목을 두드리는 작업이 작동하지 않는 문제에 직면합니다 (탭 위치가 다른 위치에 등록됩니다. 실제 항목이 그려진다). 그래서, 나는 오버라이드 할 메소드의 적절한 조합을 찾을 때까지 계속 파고들 것이다.

답변

1

저와 같은 문제가있는 사람은 해결책이 실제로 매우 간단합니다.

이처럼 OverlayItem의 당김에 경계를 설정해야 할 모든 :

Drawable d = myOverlayItem.getMarker(0); 
d.setBounds(-xWidth/2, -yWidth/2, xWidth, yWidth); 

getMarker의 매개 변수는 실제로 나를 위해 모두의 동일 overlayItem의 상태에 따라 다르지만 개인적으로 내 주 그래서 상관 없어 그냥 0을 사용했습니다.

내가 실제로 어떻게 경계를 설정하는 방법에 따라 달라질 수 있을지 모르겠지만, 나를 위해 내 ItemizedOverlay 하위 클래스의 그리기 방법 내에서 해냈어 :

@Override 
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) { 
    if (!shadow) { 
     // Do your projection calculations here, if necessary 

     for (int i = 0; i < mOverlays.size(); i++) { 
      Drawable d = mOverlays.get(i).getMarker(0); 
      d.setBounds(-width/2, -height/2, width/2, height/2); 
     } 
    } 

    super.draw(canvas, mapView, shadow); 
} 

오버레이 항목의 경계가 0,0에서 시작한다는 사실에 주목할 가치가 있습니다. 실제로는 오버레이 아이콘의 왼쪽 상단으로 캔버스가 변환됩니다. 위 예제에서 너비를 50으로, 높이를 50으로 설정하면 OverlayItem은 정의 된 위치를 중심으로지도에 그려집니다 (OverlayItem의 생성자에서 설정 됨). 당신은 오버레이의 소스에서 이런 일을 볼 수

protected static void drawAt(Canvas canvas, Drawable drawable, int x, int y, boolean shadow) 
    { 
     // .... Do Stuff .... 

     canvas.save(); 
     canvas.translate(x, y); 

     // .... Do Stuff .... 

     drawable.draw(canvas); 

     // .... Do Stuff .... 

     canvas.restore(); 
    } 

는 (그것은 canvas.translate 호출로 발생)

을 오프 기회에 누군가가 here's the full source for Overlay을 관심 것이다.

(지도 작업을 리버스 엔지니어링하는 데 많은 시간이 걸렸으므로 최대한 노력했습니다.)

관련 문제