0

これまで、私は常に OverlayItems と自分で作成したクラス Point を使用して、MapActivities に「ポイント」を描画していました。このメソッドを使用すると、MapActivity にいくつかの「ポイント」を描画できます。しかし、どうすれば「クリック可能な」ポイントを描くことができますか??

私はこのクラス Point を即興で作成し、OverlayItems メソッドに関するチュートリアルに従いますが、この「クリック可能なポイント」について自分で説明した任意のメソッドを実装できます。

ありがとう。

4

2 に答える 2

0

クリック可能なOverlayItemsを実装する方法の例としてこのプロジェクトをご覧くださいhttps://github.com/jgilfelt/android-mapviewballoons

于 2012-11-04T20:53:24.053 に答える
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;

  }

基本的な考え方は、ユーザーが地図上でクリックしたポイントを取得し、そのポイントを緯度経度に変換してから、データ ポイントを反復して一致を探すことです。私は +/- 30 ピクセルのヒット テストを使用していることに注意してください (これをもう一度取り上げるときはハード コードしません。

似たようなものに出くわした場合に備えて、TODO を残しましたが、PinDetailsDialog クラスの実装のどこかに完全に問題があると思われます。

複数のマップ ビューを使用しており、それぞれが SQLite テーブルに格納されたデータを使用しています。データを読み取るカーソルへの参照を Mapview のタグ プロパティに保存するため、.getTag() を呼び出します。

于 2012-11-04T20:54:21.093 に答える