Android itemizedOverlay действие onTap переопределено - PullRequest
3 голосов
/ 09 августа 2011

У меня есть класс:

class MapItemizedOverlay extends com.google.android.maps.ItemizedOverlay<OverlayItem> { 
    private Context context;
    private ArrayList items = new ArrayList();

    public MapItemizedOverlay(Context aContext, Drawable marker) {
        super(boundCenterBottom(marker));
        context = aContext;
    }

    public void addOverlayItem(OverlayItem item) {
        items.add(item);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return (OverlayItem) items.get(i);
    }

    @Override
    public int size() {
        return items.size();
    }

    @Override
    protected boolean onTap(int index) {
       OverlayItem item = (OverlayItem) items.get(index);
       AlertDialog.Builder dialog = new AlertDialog.Builder(context);
       dialog.setTitle(item.getTitle());
       dialog.setMessage(item.getSnippet());
       dialog.show();
       return true;
    }

    @Override
    public boolean onTap (final GeoPoint p, final MapView mapView) {
        Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
        try {
            List<Address> addresses = geoCoder.getFromLocation(p.getLatitudeE6() / 1E6,
                        p.getLongitudeE6() / 1E6, 1);
            String address = "";
            if (addresses.size() > 0) {
            for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); i++)
                    address += addresses.get(0).getAddressLine(i) + "\n";
            }   
            address.cancel();
            address.setText(address);
            address.show(); 
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }
}

Я добавляю несколько оверлеев на карту с помощью функции:

private void initialiseOverlays() {
        // Create an ItemizedOverlay to display a list of markers
        Drawable defaultMarker = getResources().getDrawable(R.drawable.marker);
        MapItemizedOverlay mapItemizedOverlay = new MapItemizedOverlay(this, defaultMarker);

        mapItemizedOverlay.addOverlayItem(new OverlayItem(new GeoPoint((int) (12.345678 * 1E6), (int) (23.456789 * 1E6)), "Point 1", "some-random-text"));
        mapItemizedOverlay.addOverlayItem(new OverlayItem(new GeoPoint((int) (89.012345 * 1E6), (int) (67.890123 * 1E6)), "Point number 2", "more-random-text"));        
        // Add the overlays to the map
        mapView.getOverlays().add(mapItemizedOverlay);
      }

Если определена только одна из функций onTap, все работает нормально -Я могу получить адрес, если я щелкну где-нибудь по карте, или я могу получить диалог с названием места и содержанием, если я нажму на значок над местом.Но я хочу, чтобы обе функции работали вместе, чтобы приложение обнаруживало, был ли щелчок мыши над пустым местом на карте или над маркером (набором для рисования) и отображало его информацию.Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Нашел ответ - пришлось включить:

if(super.onTap(p, mapView)) {
                return true;
            }

в начало функции public boolean onTap (final GeoPoint p, final MapView mapView).

0 голосов
/ 09 августа 2011

вы можете использовать метод onTouch

@Override
        public boolean onTouchEvent(MotionEvent event, final MapView mapView) {
            final int action=event.getAction();
            final int x=(int)event.getX();
            final int y=(int)event.getY();
            result = false;
            if (action==MotionEvent.ACTION_DOWN) {
                downPressed = true;
                drag = false;
/* here check for the items is null or not and then after get all the items 
   so if you click on map and on that place if the item on placed then it will
   check for the item hit other it refer the user click on map not on marker 

*/
                if(items!=null){
                    for(int i=0;i<items.size();i++){
                        OverlayItem item = items.get(i);
                        Point mp=new Point(0,0);
                        mapView.getProjection().toPixels(item.getPoint(), mp);
                        xDragTouchOffset=x-mp.x;
                        yDragTouchOffset=y-mp.y;
                        if (hitTest(item, marker, x-(mp.x-(xDragImageOffset+xDragTouchOffset*2)), y-(mp.y-((yDragImageOffset/2)+yDragTouchOffset)))) {
                            result = true;
                            markerIndex = i;
                            task_id = Long.parseLong(item.getTitle());
                            downPressed = false;
                            markerPressed = true;
                            break;
                        }
                    }
                }
        }
        else if (action==MotionEvent.ACTION_MOVE) {
     // here user pressed and drag the downPressed set to false so it will indicate that user want to move the map and drag set to true;
            downPressed = false;
            drag=true;
        }
        else if (action==MotionEvent.ACTION_UP) {
    // if user not drag then this downPressed is true and it will return the screen and map coordinate
            if(downPressed){

                    tempPoint = mapView.getProjection().fromPixels(x, y);
                    markerLat = tempPoint.getLatitudeE6()/1e6;
                    markerLng = tempPoint.getLongitudeE6()/1e6;
                    mapView.invalidate();
            }

            drag = false;
            downPressed = false;
        }
        return(result | super.onTouchEvent(event, mapView));
    }

здесь я могу сделать это, надеюсь, у вас есть идея

...