【问题标题】:Android itemizedOverlay's onTap action overridedAndroid逐项覆盖点击操作被覆盖
【发布时间】:2011-08-09 11:28:02
【问题描述】:

我有一堂课:

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 函数,一切正常 - 如果我单击地图上的某个位置,我可以获取地址,或者如果我单击该地点上方的图标,我可以获得包含该地点标题和内容的对话框. 但我想让这两个功能一起工作,应用程序检测点击是在地图上的空白处还是在标记(可绘制集)上并显示它的信息。我怎样才能做到这一点?

【问题讨论】:

    标签: android maps itemizedoverlay overlayitem


    【解决方案1】:

    找到答案 - 必须包括:

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

    public boolean onTap (final GeoPoint p, final MapView mapView)函数的开头。

    【讨论】:

      【解决方案2】:

      你可以使用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));
          }
      

      这里我可以这样做希望你有一些想法

      【讨论】:

      • 这里代码中task.equals 的任务是什么。 onTouch method 对我来说有点不清楚 - 您能否在上面的代码中添加一些 cmets。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2020-09-10
      • 2014-09-15
      • 2019-11-22
      相关资源
      最近更新 更多