0

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

また、マーカーをマップ上のどこにでも問題なくドラッグできます。ただし、これにより、現在の場所のポインターも移動しました (ユーザーが移動しようとした場合)。同じオーバーレイ クラスを使用したいだけですが、ポインターを現在の場所に固定したいので、移動できないようにする必要があります。タッチされているオーバーレイ項目を見つける方法はありますか? または、他の回避策が非常に役立ちます。ありがとう。

4

2 に答える 2

1

最も簡単な方法は、クラス OverlayClass をサブクラス化し、その中の動きを無効にすることです。

アップデート:

OverlayClass をサブクラス化し、その onTouchEvent() 関数をオーバーライドします。この関数では、イベントの座標を取得し、このオーバーレイ内のすべてのオーバーレイ アイテムでヒット テストを実行します。アイテムがヒットしない場合は、super.onTouchEvent() を使用してこのイベントを親クラスに渡します。それ以外の場合は、何もせずに true を返します。ここで、ロケーション オーバーレイを除くすべてのオーバーレイに元のクラスを使用し、ロケーション オーバーレイにはこのサブクラスを使用します。

ところで、組み込みの MyLocationOverlay クラスを使用して、(ユーザーの) 場所を地図上に表示することもできます。このために、同じことを行います。つまり、場所以外のすべてに OverlayClass を使用します。場所については、クラスに組み込まれている MyLocationOverlay を使用します。

于 2012-07-06T12:07:09.683 に答える
0

シナリオを処理するには、 onTouch イベントにロジックを配置する必要があると思います これを調べると役立つかもしれませんチュートリアル 1 チュートリアル 2

于 2012-07-06T12:03:41.007 に答える