web-dev-qa-db-ja.com

マーカークリックイベントを無効にする方法は?

すでにmrkr.showInfoWindow()でマーカータイトルを表示しているシンプルなアプリを開発していますが、ユーザーにそのマーカーをもう一度タップさせたくありません。特定のマーカーのクリックイベントを無効にする方法は?

これが私が試した方法です。

   Marker marker = gMap.addMarker(new MarkerOptions().position(new LatLng(location
                    .getLatitude(), location.getLongitude())).title("I am here").icon(BitmapDescriptorFactory.fromResource(R.drawable.mrk1)));
            marker.showInfoWindow();
//how to use marker.setClickable here or somthing here.?

アプリケーション全体でマーカーのinfowindow()/ titleを表示するにはどうすればよいですか?

14
Aparichith

GoogleMapオブジェクトでonMarkerClickListenerを設定できます

map.setOnMarkerClickListener(new OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            return true;
        }
    });
25
Wishmaster

3年後のこの時点までに、マーカーのクリックを通過させてマップ自体(OnMapClickListener)で処理する方法がないことは明らかです。マーカーは常にこのイベントをインターセプトしますが、クリックからデフォルトの動作を無効にすることができます(上記の回答が示すように)。以下は、より良い解決策を必要としている人を助けることができる場合に備えて投稿されています。

この制限を回避するには、2つのオプションがあります。私は両方を実装しました。リクエストに応じてコードをクリーンアップして共有できます。

1.)処理したくないウェイポイントがペイントされたGroundOverlayビットマップを作成します。 GoogleMapのProjectionオブジェクトを使用して、画面のPointsからLatLngに変換し、ビットマップを配置する場所を計算して、ウェイポイントが正しい場所に表示されるようにします。回転、マップのパディング、およびその他のいくつかの問題を処理するのはかなり複雑です。ズームインすると、ウェイポイントマーカーのサイズが大きくなり、onCameraIdleイベントでビットマップを再作成し、必要に応じてGroundOverlayを再配置します。これは私が本番環境で使用している方法です。パン、回転、ズームはすべて非常にスムーズで、グラウンドオーバーレイはタップを処理するかどうかを設定できるため、問題が解決します。これを傾けて機能させる方法がわかりませんでした。ウェイポイント自体は回転中に北を向いたままではありませんが、GroundOverlayが再作成されるときに直立して回転することができます。 onCameraIdleがグラウンドオーバーレイの再作成を引き起こした後、マップの短い一時停止/無応答があります。

2.)画面全体をカバーするViewオブジェクトを作成し、ビューのonDrawメソッドでウェイポイントマーカーをペイントします。ここでも、GoogleMapの投影オブジェクトを使用して、マーカーをペイントする場所を計算します。 onCameraMoveイベントのときにビューでinvalidate()を呼び出すと、マーカーが新しい画面位置に再描画されます。これの主な利点は単純さです。回転、傾斜、マップのパディングオフセットはすべて自動的に処理されます。主な欠点は、すべてのonCameraMoveイベントで無効にすると、CPUが少し集中しすぎて(おそらく)、マップのパン/ズームが途切れる可能性があることです。 3つまたは5つの移動イベントごとに無効にすると、ウェイポイントは新しい位置に十分な頻度で再描画されないため、パン/ズーム時にバウンドしているように見えます。ただし、マップ移動の終了時に遅延はありません。最終的に、マップ上に100〜200のウェイポイントがあるため、「パン中」のパフォーマンスの問題は私にはあまりにも目立ちました。

これが誰かを助けることを願っています。コードのヘルプが必要な場合はお知らせください。

7
mstenroos

以下のように onMarkerClickListener を使用できます。

mMap.setOnMarkerClickListener( new OnMarkerClickListener()
{
    @Override
    public boolean onMarkerClick ( Marker marker )
    {
        // do nothing
        return false;
    }
});
0
Lucifer