2011-11-02 93 views
2

我一直在尝试实现OnTouchEvent,因此当用户移动(拖动&拖放)overlayitem时,我可以做出反应。无法使用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, x - p.x, y - p.y)) {

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

第二个是,你应该取消注释pj.fromMapPixels(x, y, t);

还你或许应该取消注释dragImage.setVisibility(View.VISIBLE);如果您想要在拖动时看到图像