グーグルマップv2アンドロイドマップのスポットをクリックしたいのですが。クリックしたポイントがポリラインパス上のポイントと交差する場合は、ポリラインを表示します。Androidでポリラインのクリック可能なイベントが文書化されていません。現在のポリラインオブジェクトを拡張しようとしました(finalとマークされています)
他にどのようなオプションがありますか?
グーグルマップv2アンドロイドマップのスポットをクリックしたいのですが。クリックしたポイントがポリラインパス上のポイントと交差する場合は、ポリラインを表示します。Androidでポリラインのクリック可能なイベントが文書化されていません。現在のポリラインオブジェクトを拡張しようとしました(finalとマークされています)
他にどのようなオプションがありますか?
ライブラリを使用できます: https://github.com/googlemaps/android-maps-utils
次のメソッド (OnMapClickListener 内) を使用して、ポリラインへのクリックを検出します。
PolyUtil.isLocationOnPath(point, polyline.getPoints(), isGeodesic, tolerance);
Maps API v8.4の最近の更新により、クリッカブルが導入されました Polyline
ドキュメントで述べたように:
を使用し
OnPolylineClickListener
て、クリック可能なポリラインでのクリック イベントをリッスンします。このリスナーをマップに設定するには、 を呼び出しますgoogleMap.setOnPolylineClickListener(...)
。onPolylineClick(Polyline)
ユーザーがポリラインをクリックすると、コールバックを受け取り ます。
グラドル依存性:
compile 'com.google.android.gms:play-services-maps:8.4.0'
コールバックを実装します:GoogleMap.OnPolylineClickListener
ポリラインを初期化:
Polyline polyline = googleMap.addPolyline(options);
polyline.setClickable(true);
...
イベントを受け取る
@Override
public void onPolylineClick(Polyline polyline) {
....
}
ハッピーコーディング:)
ポリラインでクリック イベントを処理できないという同様の問題がありました。私は C# である Xamarin for Android を使用していましたが、この場合、機能は Android Java ライブラリとほぼ同じです。
結局、私は唯一の選択肢と思われる方法を実行することになりました。
これには、ポリラインのすべての中間点 (約 1300 あります) の処理が含まれていました。すべての で、クリック イベントのOnMapClick
を取得し、LatLng
それと静的 のすべてのポリラインの中点との間の距離式を実行しましたList<PolylineOptions>
。次に、マップ マーカーを最も近いポリラインにアタッチしました。
ポリラインをタップすると、約 4 分の 1 秒でマーカーがポップアップ表示されます。
Google Maps API から実装されたマーカー クリック イベントも同様の方法で機能すると思います。
これは、クリックに最も近いポイントの検索を処理する for ループです。
int i = 0;//create an indexer for the loop
double shortestDist = 100;//set an initial very large dist just to be safe
int myIndex = 0;//set variable that will store the running index of the closest point
foreach (PolylineOptions po in myPolylines) {
var thisDist = Distance (point, midPoint (po.Points [0].Latitude, po.Points [0].Longitude, po.Points [1].Latitude, po.Points [1].Longitude));//calculate distance between point and midpoint of polyline
if (thisDist < shortestDist) {
shortestDist = thisDist;//remember current shortest distance
myIndex = i;//set closest polyline index to current loop iteration
}
i++;
}
私はそれが最もきれいなコードではないことを知っていますが、それは仕事を成し遂げます. インターネットのどこにもこれに対する本当の答えがなかったので、ここにあります。中点を事前に計算し、それらを同じサイズのリストに保存し、マップをクリックするたびに各ポリラインに対して中点式を呼び出す必要がないようにすることで、おそらくより効率的になる可能性がありますが、すでに非常に高速に動作しています.
編集
ちなみに、Galaxy s3でテストを行っているので、それほど効率的ではないと思います。
を登録しOnMapClickListener
ます。特定のクリックが自分の回線上にあるかどうかを自分で判断します。もしそうなら、この場合あなたがやりたかったことは何でもしてください。