谷歌地图与叠加层

时间:2012-07-06 11:53:40

标签: android google-maps overlays

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

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

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

2 个答案:

答案 0 :(得分:1)

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

更新:

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

顺便说一下,您还可以使用内置的MyLocationOverlay类在地图上显示您的(用户)位置,而不会有任何额外的麻烦。为此您也要这样做,即使用OverlayClass除了位置之外的所有内容。对于位置使用MyLocationOverlay构建在类中。

答案 1 :(得分:0)

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