2012-07-06 2 views
0

Google지도를 사용하는 앱이 있습니다. 지도에 오버레이가 있습니다.오버레이가있는 Google지도

public class OverLayClass extends ItemizedOverlay<OverlayItem> 
{ 
    private Drawable marker = null; 
    private OverlayItem inDrag = null; 
    private ImageView dragImage =null; 
    private int xDragImageOffset, yDragImageOffset, xDragTouchOffset, yDragTouchOffset; 

    public OverLayClass(Drawable marker) 
    { 
     super(boundCenterBottom(marker)); 
     this.marker = marker; 
     overlayItems = new ArrayList<OverlayItem>(); 

     // image to show when you drag pointer on screen to other location 
     dragImage = (ImageView)findViewById(R.id.drag_image); 

//   if(dragImage != null && dragImage.getDrawable() != null) 
     { 
      xDragImageOffset =  getResources().getDrawable(R.drawable.map_icon_corn).getIntrinsicWidth()/2; 
      yDragImageOffset =  getResources().getDrawable(R.drawable.map_icon_corn).getIntrinsicHeight(); 
     } 
     populate(); 
    } 

나는이 클래스를 사용하여 모든 오버레이를 구현했습니다. 동일한 오버레이 클래스를 사용하여 사용자의 현재 위치도 표시하고 있습니다. 이 오버레이 클래스

onTouch은 다음과 같습니다

public boolean onTouchEvent(MotionEvent motionEvent, MapView mapView) 
    { 
     //System.out.println(" --- inside onTouchEvent --- "+dontAddtap); 
      final int x = (int)motionEvent.getX(); 
      final int y = (int)motionEvent.getY(); 
      boolean result = false; 

     // TODO Auto-generated method stub 
//    if(dontAddtap) 
      { 
       if(motionEvent.getAction() == MotionEvent.ACTION_DOWN && !isActionDown) 
       { 
        //System.out.println(" ------ on key down ------ geo point "+pt1); 
        if(!isTap) 
        { 
         for(OverlayItem item : overlayItems) 
         { 
          Point p = new Point(); 

           mapView.getProjection().toPixels(item.getPoint(), p); 
           item.setMarker(marker); 
           boolean isHit = hitTest(item, marker, x - p.x, y - p.y); 
           //System.out.println(" --- isHit in MotionEvent.ACTION_DOWN --- "+isHit); 
           if(isHit) 
           { 
            isItemHit = true; 
            //System.out.println(" --- item hit ---- "); 

            result = true; 
            inDrag = item; 

            overlayItems.remove(inDrag); 
            gotGeoPoint = item.getPoint(); 
            //System.out.println(" -------- imporntent--item--otuched point -------- "+item.getPoint()); 
            populate(); 

            xDragTouchOffset = 0; 
            yDragTouchOffset = 0; 

            setDragImagePosition(p.x, p.y); 
            dragImage.setVisibility(View.VISIBLE); 
            // Point p11=new Point(p.x, p.y); 
            xDragTouchOffset = x - p.x; 
            yDragTouchOffset = y - p.y; 

            OverlayItemArryList.remove(item); 
            // 
            mapController_.stopAnimation(true); 
            break; 
           } 
         }      
        } 
       } 
      } 

     if(dontAddtap && isItemHit) 
     { 
      if(motionEvent.getAction() == MotionEvent.ACTION_MOVE && inDrag != null) 
      { 
       //System.out.println(" --- onTouchEvent ACTION_MOVE --- "); 
       setDragImagePosition(x, y); 

       result = true; 
       isTap = isActionDown = false; 
      }    
     } 

     if(dontAddtap || isItemHit) 
     { 
      if(motionEvent.getAction() == MotionEvent.ACTION_UP && inDrag != null) 
      { 
       //System.out.println(" --- onTouchEvent ACTION_UP --- "); 

       if(isItemHit) 
       { 
        dragImage.setVisibility(View.GONE); 

        GeoPoint pt = mapView.getProjection().fromPixels(x-xDragTouchOffset,y-yDragTouchOffset); 

        toDrop = new OverlayItem(pt, inDrag.getTitle(), inDrag.getSnippet()); 

        overlayItems.add(toDrop); 

        //System.out.println("------------- on drag drop point -------------- "+toDrop.getPoint()); 

        addGeo = toDrop.getPoint(); 

        //addReferenceToOverLayList.add(toDrop); 
        ////////System.out.println(" addReferenceToOverLayList.add "+toDrop.getPoint()); 
        Iterator<GeoPoint> st = geoArrayist.iterator(); 
        // update array list with new values when any of the coordinate is moved 
        while(st.hasNext()) 
        { 
         int k = 0; 
         GeoPoint check = st.next(); 
         if(check.equals(gotGeoPoint)) 
         { 
          //////System.out.println("yes we got geo points"); 
          k = geoArrayist.indexOf(gotGeoPoint); 
          //////System.out.println(" - item index got from the array list - "+k); 
          geoArrayist.set(k, addGeo); 
          //////System.out.println(" --- updated array --- "+geoArrayist); 
         }      
        } 
        dontAddtap = result = true; 
        isItemHit = isActionDown = false; 
        populate(); 
       } 
      }    
     } 
     return(result || super.onTouchEvent(motionEvent, mapView)); 
    } 

그리고 나는 아무 문제없이지도의 아무 곳이나 마커를 드래그 할 수 있어요. 그러나 이로 인해 현재 위치 포인터가 이동하게됩니다 (사용자가 이동하려고하면). 난 그냥 같은 오버레이 클래스를 사용하고 싶지만 포인터를 현재 위치에 고정하려고합니다. 움직일 수 없어야합니다. 어떤 오버레이 항목을 만진 지 알 수있는 방법이 있습니까? 또는 다른 해결 방법은 큰 도움이 될 것입니다. 감사.

+0

생성자에 부울을 추가하여이 표식이 현재 위치 표식인지 여부를 판단하는 방법은 어떻습니까? 그런 다음 탭하고 이동할 수 없도록 선택할 수 있습니다. – Carnal

답변

1

가장 간단한 방법은 그것에서 수업 OverlayClass 및 해제 움직임을 서브 클래 싱하는 것입니다 도움이 될 수있는이 들여다 당신이 당신의 시나리오를 처리 할 수 ​​onTouch 이벤트 로직을 넣어야 할 것 같아요.

UPDATE :

서브 클래스 OverlayClass와 onTouchEvent() 함수를 재정의합니다. 이 함수에서 이벤트의 좌표를 가져오고이 오버레이의 모든 오버레이 항목으로 적중 테스트를 수행합니다. 항목에 히트가없는 경우 super.onTouchEvent()를 사용하여이 이벤트를 부모 클래스에 전달하고, 그렇지 않으면 아무 것도하지 않고 true를 반환합니다. 이제 위치 오버레이를 제외한 모든 오버레이에 원래 클래스를 사용하고 위치 오버런에이 하위 클래스를 사용합니다.

BTW MyLocationOverlay 내장 클래스를 사용하여 추가 번거 로움없이지도에서 (사용자의) 위치를 표시 할 수도 있습니다. 이를 위해 동일한 작업을 수행합니다. 즉, 위치를 제외한 모든 작업에 대해 OverlayClass를 사용합니다. 위치에 MyLocationOverlay 클래스가 내장되어 있습니다.

+0

좀 더 정교하게 신경 쓰시겠습니까? 감사. – user1351659

+0

@ user1351659 : 내 답변에 세부 정보를 추가했습니다. – binW

+0

감사합니다. 그것을 시도 할 것이다. – user1351659

관련 문제