2010-08-13 2 views
1

나는 공격 방법을 모르는 이상한 문제가있어서 전에 비슷한 문제가 있었는지 궁금합니다.ItemizedOverlay가 "부러진"투영으로 그려진 것처럼 보입니다.

ItemizedOverlay 하위 클래스의 그리기 (Canvas canvas, MapView mapView, 부울 그림자) 메소드를 오버라이드하여 항목 사이에 경로, 텍스트 등을 그립니다. 오버라이드에서 제일 먼저하는 일은 모든 매개 변수를 사용하여 super.draw를 호출하는 것입니다. 앱을 시작할 때 오버라이드에 그려지는 선은 원래 있던 곳이지만 super.draw가 그린 실제 OverlayItem은 꺼져 있습니다. 흥미로운 점은지도를 왼쪽 위 모서리 (좌표 0,0)로 이동하면 OverlayItems가 내가 기대하는 위치에 더 가깝고 가까이 갈 수 있다는 것입니다. 실제로 첫 번째 구할 때 완벽하게 일치하는 것처럼 보입니다 점 대 점 (0,0)). OverlayItems가 (0,0) 점에서 멀어 지도록 맵을 이동하면 직선적으로 지리적 위치에서 더 멀어집니다.

누구도이 문제에 직면 해 있지 않으며 분명하지는 않습니다.이 동작을 여전히 여기에 게시하는 최소한의 예제를 만들려고합니다. 실제 코드는 비교적 크기 때문에 문제가 무엇인지 알 수 있다면 많은 노력을 피하고 싶습니다.

편집 : 도움이 될 수있는 정보의 추가 조각 ... 내 그리기 방법은 다음과 같습니다

public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    super.draw(canvas, mapView, shadow); 
    if (!shadow) { 
     // code for drawing the lines etc. 
     // on the canvas (uses mapView.getProjection()) 
    } 
} 

그림자 층이없는 오버레이의 정의 부분은 (내가 사용했습니다 Overlay를 문제없이 확장 할 때 동일한 논리). super.draw로 OverlayItems에 그려지는 그림자 레이어는 실제로 Drawable과 각 특정 항목에 대한 예상 된 Geolocation 사이의 중간에 있습니다.

다음은 avd의 트리 스크린 샷으로 어떤 일이 일어나는지 더 잘 보여줍니다. 네 개의 빨간색 핀은 위의 빨간색 선 위에 있어야하며지도를 왼쪽 상단으로 밀면 실제로 선을 향해 이동해야합니다. 두 개의 핀과 그 사이의 선은 내 사용자 정의 오버라이드에 그려지며 super.draw는 네 개의 그림자와 네 개의 추가 빨간색 핀을 그립니다.

이것은 첫 번째 게시물이기 때문에 하나 이상의 링크를 게시 할 수 없으므로 동일한 jpg에 3 개의 스크린 샷을 모두 넣습니다.
screenshot

답변

0

코드를 보지 않고도 진단하기가 어렵습니다. 그래도 몇 가지 사항을 확인해 보겠습니다.

  1. MapView의 투영을 사용하고 있습니까? draw()가 호출 될 때마다 새 것을 검색하도록하고 있습니까?

  2. 당신의 Drawables에 대한 바운드 메소드를 확인 했습니까? 예를 들어, boundCenter() 또는 boundCenterBottom()

+0

1. 그렇습니다. draw 메소드의 첫 번째 요소 중 하나 인 mapView.getProjection()을 호출하고 그 draw 메소드의 지속 시간 동안 반환 된 객체를 사용합니다. 그러나 정확한 값을 사용하지 않는다고 생각하지 않습니다. 슈퍼 드로 (super.draw) 호출의 결과로 예기치 않은 결과가 나옵니다. 2. 예, 모든 OverlayItem에 동일한 기본 드로어 블을 사용 중이며 super (boundCenterBottom (defaultMarker))를 통해 생성자에서 설정 중입니다. –

0

나는이 문제를 해결하고 난 내가 다른 사람에게 유용 할 수있어 통찰력을 것 같아요, 그래서 여기에 무슨 일이 있었는지 설명 할 것이다. 나는 그것이 내 자신의 질문에 대답하는 것이 적절한 지 확신하지 못한다. 그렇지 않다면,이 텍스트를 넣어야하는 곳을 가르쳐 주면 적절하게 편집/삭제할 것이다.

Drawables가 그려지는 근본적인 방법에 대한 오해에서 문제가있었습니다. 이 오해는 Drawable 용 JavaDoc을 읽음으로써 발생했습니다.그릴 밝히는 : 그 경계에서

그리기가 (setBounds를 통해 설정) 등 (setAlpha를 통해 설정) 알파와 (setColorFilter를 통해 설정) 컬러 필터로 존중 선택 효과. 내가 원래 당신이 스크린 샷에서 볼 수있는 경로를 그리기 오버레이 서브 클래스를했고, (그들은 쉽게 tappable 등되도록) 나는 약간 변경에 착수하는 경로를 따라 마커 ItemizedOverlay를 사용하기로 결정 때문에

내 수업. 특정 시점에서 예상했던대로 작동하는지 확인하기 위해 일부 항목을 추가하고 경로 끝점 중 하나에 대해 동일한 Drawable을 사용했습니다. 추첨 방법에 대한의 JavaDoc에 의해 유도, 내가 경로를 그리기 위해이 같은 것을 사용 내가 super.draw 호출을 통해 추적 할 때

private void drawMarker(Canvas canvas, Projection projection, 
    GeoPoint location, Drawable drawable) { 
    Point point = projection.toPixels(location, null); 
    drawable.setBounds(
     point.x, 
     point.y - drawable.getIntrinsicHeight(), 
     point.x + drawable.getIntrinsicWidth(), 
     point.y); 
    drawable.draw(canvas); 
} 

그러나, 나는 그것이 Drawable.draw하지만 호출 결국 것으로 나타났습니다 엔드 포인트 drawable은 항상 같은 경계를 가졌습니다. 즉,이 drawMarker 메소드에 대한 이전 호출에서 설정 한 경계가있었습니다. 나는 Drawable.draw가 Drawable을 실제로 어디에 두어야 하는지를 아직도 이해하지 못하고 있지만 그 점에서 필자가 질문에서 설명한 동작은 꽤 분명합니다. 뒤늦게 볼 때, 아마도 boundCenter와 boundCenterBottom이 실제로 Drawable (JavaDoc이 말하는 것)의 경계를 정의했음을 깨달았어야합니다. 대신에 경계가 "결국"결정되는 방식을 변경했다고 생각한 것 같습니다. 그리려는 지점을 알고 있습니다.

어쨌든 오버레이 아이템에 실제로 사용하고 싶었던 드로어 블을 사용하기 위해 약간의 추가 기능을 추가했습니다. 물론 완벽하게 작동합니다. drawMarker에서 수행중인 작업이 수행되는 방식인지 궁금해합니다. 그러나 Drawable을 배치 할 위치를 캔버스에 알려주는 다른 방법을 알지 못합니다.

관련 문제