在MapActivity中设置onClickListener方法?

时间:2012-11-04 20:42:52

标签: android mapactivity

直到现在,我总是画"积分"在MapActivities中使用OverlayItems并使用我创建的类Point。通过这种方法,我可以画出一些"点"在MapActivity中。但我如何绘制"可点击"点?

我即兴创作了这个类Point,并按照有关OverlayItems方法的教程,但我可以实现任何你自己为此解释的方法"可点击的点"。

感谢。

2 个答案:

答案 0 :(得分:0)

以该项目为例,了解如何实现可点击的OverlayItems https://github.com/jgilfelt/android-mapviewballoons

答案 1 :(得分:0)

我找不到这样做的方法所以我编写了自己的点击逻辑。这是来自我现在放在冰上的项目,并且正在进行中(例如硬编码值),但逻辑有效。希望它有所帮助:

      @Override
  public boolean onTap(GeoPoint geoPoint, MapView mapView){

      if (!isRoute){ // nothing to do if it's a route

          Cursor cursor = (Cursor) mapView.getTag();
          Projection projection = mapView.getProjection();

          // get pixels for the point clicked
          Point clickedPoint = new Point();
          projection.toPixels(geoPoint, clickedPoint);

          if (cursor.moveToFirst()){
                do {

                    try {
                        Double lat = cursor.getFloat(Database.LAT_COLUMN) * 1E6;
                        Double lng = cursor.getFloat(Database.LONG_COLUMN) * 1E6;
                        GeoPoint thisGeoPoint = new GeoPoint(lat.intValue(), 
                                                             lng.intValue());

                        // get pixels for this point
                        Point overlayPoint = new Point();
                        projection.toPixels(thisGeoPoint,overlayPoint);

                        // did the user click within 30 pixels?
                        if ((Math.abs(clickedPoint.x - overlayPoint.x) < 30) && (Math.abs(clickedPoint.y - overlayPoint.y) < 30)){

                            // get a cursor to this record
                            Cursor thisCursor = TestApp.db.rawQuery("SELECT * FROM " + Database.DATABASE_TABLE_PINS + " WHERE CID='" + cursor.getString(Database.ID_COLUMN) + "'", null);
                            thisCursor.moveToFirst();

                            // create and show an instance of the PinDetailsDialog
                            PinDetailsDialog customiseDialog ;
                            // TODO this is a kludge, why does this throw an exception sometimes?
                            try{
                                customiseDialog = new PinDetailsDialog(mapView, context,thisCursor,context.getResources().getConfiguration().orientation);
                                customiseDialog.show(); 
                            } catch (Exception e){
                                customiseDialog = new PinDetailsDialog(mapView, mapView.getContext(),thisCursor,context.getResources().getConfiguration().orientation);
                                customiseDialog.show(); 
                            }               

                            return true;
                        }


                    } catch (Exception e){
                        e.printStackTrace();
                    }

                } while(cursor.moveToNext());       
          }

      }
      return true;

  }

基本思路是获取用户点击地图的点,将点转换为lat long,然后迭代我的数据点寻找匹配。请注意,我使用的是+/- 30像素的点击测试(当我再次选择它时,我不会硬编码。

我把TODO留在那里以防你遇到类似的事情,但我怀疑它完全归结于我的PinDetailsDialog类实现中的某个问题。

我使用多个地图视图,每个视图都使用存储在SQLite表中的数据。我存储对游标的引用以读取Mapview的tag属性中的数据,因此调用.getTag()。