2011-09-22 5 views
0

지도를 오래 터치 할 때 새 장소를 추가하고 싶습니다.하지만 문제는지도를 이동할 수없는 오버레이를 추가 할 때입니다. 코드는 다음과 같습니다.지도에서 내 항목 별 오버레이를 제어하는 ​​방법은 무엇입니까?

public class CustomPinPointOverlay extends ItemizedOverlay<OverlayItem> { 

    private GeoPoint newMarkerLocation; 

    public CustomPinPointOverlay(GeoPoint newMarkerLocation, 
      Drawable defaultMarker) { 

     super(boundCenterBottom(defaultMarker)); 
     this.newMarkerLocation = newMarkerLocation; 
     populate(); 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return new OverlayItem(this.newMarkerLocation, null, null); 
    } 

    public void draw(android.graphics.Canvas canvas, MapView mapView, 
      boolean shadow) { 
     super.draw(canvas, mapView, false); 
    } 

    @Override 
    public int size() { 
     return 1; 
    } 
} 

이것은 itemizedoverlay를 확장하는 오버레이 클래스입니다. 코드의 다른 부분은;

public PMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setOnTouchListener(new OnTouchListener() { 

     int x, y; 
     long start, stop; 


     @Override 
     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == MotionEvent.ACTION_DOWN) { 

       start = e.getEventTime(); 
       x = (int) e.getX(); 
       y = (int) e.getY(); 

       touchedPoint = map.getProjection().fromPixels(x, y); 
      } 
      if (e.getAction() == MotionEvent.ACTION_UP) { 
       stop = e.getEventTime(); 

      } 

      if (stop - start > 1000) { 

       setEnabled(true); 
       Drawable myMarker = getResources().getDrawable(
         R.drawable.yeni_pin); 
       getOverlays().add(
         new CustomPinPointOverlay(touchedPoint, myMarker)); 


       return false; 
      } 


      return true; 
     } 


    }); 

} 

이 코드에는 어떤 문제가 있습니까?

+0

문제는 내 setOnTouchListener라고 생각합니다. 내 의견으로는 setontouch 리스너는 길게 누르기 전까지 내 터치를 듣고 있습니다. 나는 stop-start> 1000을 제외하고는 아무 것도하지 않으면 내 setontouchlistener는 내가 할 때까지 계속 듣고있다. 내가 맞습니까? – sharp

답변

1

이 답변은 PMapView가 MapView를 확장한다고 가정합니다.

위의 내용이 참이라면 처리하지 않는 한 수퍼 클래스의 onTouchEvent을 호출해야합니다. 예를 들어 위의 코드는 (당신의 긴 클릭을 캡처) 다시는 같은 일을 처리 할 수 ​​있도록 부모 캡처되지 않습니다 행동에 전달합니다

@Override 
    public boolean onTouch(View v, MotionEvent e) { 

     boolean retValue = true; 
     if (e.getAction() == MotionEvent.ACTION_DOWN) { 

      start = e.getEventTime(); 
      x = (int) e.getX(); 
      y = (int) e.getY(); 

      touchedPoint = map.getProjection().fromPixels(x, y); 
     } 
     if (e.getAction() == MotionEvent.ACTION_UP) { 
      stop = e.getEventTime(); 

     } 

     if (stop - start > 1000) { 

      setEnabled(true); 
      Drawable myMarker = getResources().getDrawable(
        R.drawable.yeni_pin); 
      getOverlays().add(
        new CustomPinPointOverlay(touchedPoint, myMarker)); 


      retValue = false; 
     } 

     if(!retValue) 
      super.onTouchEvent(e); 
     return retValue; 
    } 

(이 코드를 수정하지만 난 그것을 테스트하지 않은 것입니다) 지도 옮기기. 이 코드는 테스트되지 않았기 때문에 이상한 결과가 나타날 수 있습니다. if(!retValue)을 삭제하고 항상 super.onTouchEvent(e)으로 전화하는 것이 좋습니다.

관련 문제