0

我有一个使用谷歌地图的应用程序。我在地图上也有叠加层。

    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));
    }   

而且我可以毫无问题地将标记拖到地图上的任何地方。但是,这也导致我当前的位置指针移动(如果用户试图移动它)。我只想使用相同的覆盖类,但我想修复指向我当前位置的指针,它不应该是可移动的。有没有办法找到正在触摸的覆盖项目?或者任何其他解决方法都会有很大帮助。谢谢。

4

2 回答 2

1

最简单的方法是将您的类 OverlayClass 子类化并禁用其中的移动。

更新:

子类 OverlayClass 并覆盖其 onTouchEvent() 函数。在此函数中,获取事件的坐标并对此叠加层中的所有叠加层项目进行命中测试。如果没有命中任何项目,则使用 super.onTouchEvent() 将此事件传递给父类,否则不执行任何操作并返回 true。现在将您的原始类用于除位置叠加之外的所有叠加,并将此子类用于位置叠加。

顺便说一句,您还可以使用内置的 MyLocationOverlay 类在地图上显示您(用户)的位置,而无需任何额外的麻烦。为此,您执行相同的操作,即对除位置之外的所有内容都使用 OverlayClass。对于位置,请使用内置类的 MyLocationOverlay。

于 2012-07-06T12:07:09.683 回答
0

我认为您必须在 onTouch 事件中添加逻辑来处理您的场景查看这可能会有所帮助Tutorial 1 Tutorial 2

于 2012-07-06T12:03:41.007 回答