2011-11-02 4 views
2

사용자가 이동할 때 반응 할 수 있도록 OnTouchEvent를 구현하려고했습니다 (& 끌어서 놓기) 오버레이 항목.Osmdroid로 onTouchEvent (드래그 앤 드롭)를 구현할 수 없습니다.

Osmdroid 사이트에서 비슷한 것을 발견했습니다 : http://code.google.com/p/osmdroid/issues/detail?id=225. 참조 용으로 코드를 사용하고 있지만 여전히 나를 위해 작동하지 않습니다. 그러면 hitTest에 도달하면 응용 프로그램이 충돌합니다.

의견이 있으십니까? 감사.

public boolean onTouchEvent(MotionEvent event, MapView mapView) { 

    final int action = event.getAction(); 
    final int x = (int) event.getX(); 
    final int y = (int) event.getY(); 

    final Projection pj = mapView.getProjection(); 

    boolean result = false; 
    //Object TAG; 
    //Log.d(TAG, "onTouchEvent entered"); 

    System.out.println("onTouchEvent!");   
    Point p = new Point(0,0); 
    Point t = new Point(0,0); 

    //System.out.print(MotionEvent.ACTION_DOWN); 
    //System.out.print(action); 

    if (action == MotionEvent.ACTION_DOWN) { 

     System.out.println("Action Down!"); 

     for (OverlayItem item : mOverlays) { 

      // Create a new GeoPoint from pixel coordinates (x, y, pointReuse): 
      //pj.fromMapPixels(x, y, t); 

      // Convert the given GeoPoint to onscreen pixel coordinates (GeoPoint, pointOut): 
      pj.toPixels(item.getPoint(), p); 

      //System.out.println(t.x); 
      //System.out.println(p.x); 

      //System.out.println(t.y); 
      //System.out.println(p.y); 

      defaultMarker = item.getDrawable(); 

      if (hitTest(item, defaultMarker, x - p.x, y - p.y)) { 
       System.out.println("Action Down -> IF!"); 
       result = true; 
       inDrag = item; 
       mOverlays.remove(inDrag); 
       populate(); 

       xDragTouchOffset = 0; 
       yDragTouchOffset = 0; 

       setDragImagePosition(x, y); 
       dragImage.setVisibility(View.VISIBLE); 

       xDragTouchOffset = t.x - p.x; 
       yDragTouchOffset = t.y - p.y; 

       break; 
      } 
     } 

    } 

    else if (action == MotionEvent.ACTION_MOVE && inDrag != null) { 
     //dragImage.setVisibility(View.VISIBLE); 
     setDragImagePosition(x, y); 
     System.out.println("Action Move!"); 
     result = true; 
    } 

    else if (action == MotionEvent.ACTION_UP && inDrag != null) { 
     dragImage.setVisibility(View.GONE); 

     GeoPoint pt = (GeoPoint) pj.fromPixels(x - xDragTouchOffset, y - yDragTouchOffset); 
     OverlayItem toDrop = new OverlayItem(inDrag.getTitle(), 
       inDrag.getSnippet(), pt); 

     mOverlays.add(toDrop); 
     populate(); 

     inDrag = null; 
     result = true; 

     pj.fromMapPixels(x, y, t); 

     if((t.x - p.x) == xDragTouchOffset && (t.y - p.y) == yDragTouchOffset) { 
      System.out.println ("Do something here if desired because we didn't move item " + toDrop.getTitle()); 
     } 

     System.out.println("Action Up!"); 

    } 
    System.out.print(inDrag); 
    return (result || super.onTouchEvent(event, mapView)); 
} 

private void setDragImagePosition(int x, int y) { 
    RelativeLayout.LayoutParams lp= 
      (RelativeLayout.LayoutParams)dragImage.getLayoutParams(); 
    lp.setMargins(x-xDragImageOffset-xDragTouchOffset, 
      y-yDragImageOffset-yDragTouchOffset, 0, 0); 
    dragImage.setLayoutParams(lp); 
    } 

답변

2

위의 코드가 작동합니다. 나는 단지 내 작업 코드와 당신의 코드 사이에 다른 두 가지를 발견했다. 하나는 당신이 보내는 그러나 hitTest PARAMATERS입니다

if (hitTest(item, defaultMarker, t.x - p.x, t.y - p.y)) {

두 번째로

if (hitTest(item, defaultMarker, x - p.x, y - p.y)) {

변경 시도는 주석을 제거해야한다는 것입니다 또한 pj.fromMapPixels(x, y, t);

당신이해야 아마 주석 dragImage.setVisibility(View.VISIBLE); 당신이 경우 드래그 할 때 이미지를보고 싶습니다.