2

私は現在、OsmDroid の Drawable から拡張されたクラスを使用しています。このクラスでは、インターネットから受け取った各車の幾何学的形状を描きます。車に触れたときにいくつかの情報を提供するために、各車にリスナーを追加したいと思います。OverlayItem を使用すると、次のことができます。

ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
carOverlay.draw(new Canvas());
overlayItem = new OverlayItem("test", ""+i, geoPoint);
overlayItem.setMarker(carOverlay.getCurrent());
items.add(overlayItem);
ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlayWithFocus<OverlayItem>(this.getApplicationContext(), items,
        new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {

            @Override
            public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
                Log.i("Touch","you just tap the car");
                return true;
            }

            @Override
            public boolean onItemLongPress(final int index, final OverlayItem item) {
                return false;
            }

        });

このコードでは、今描いた画像を見ることができますが、車に触れてもイベントは発生せず、線を削除すると:

overlayItem.setMarker(carOverlay.getCurrent());

カスタム マーカーの代わりにデフォルト マーカーが表示されるようにするには、タッチ イベントが発生します。

それで、私は何を間違っていますか?同じでなければなりませんか?

4

3 に答える 3

0

tmouseは正しいです。ItemizedOverlayWithFocus.draw()メソッドをオーバーライドして、キャンバスで車を描画する場合は、次を追加する必要があります。

super.draw(canvas, view, shadow);

スーパーは、(ソースで見ることができるものから)ジェスチャーのタッチ可能な領域として使用されるOverlayItemのホットスポットをセットアップして使用します。

ただし、元のマーカーとキャンバスに描画されたマーカーは引き続き表示されます。さらに、車を移動すると、タッチ可能な領域も一緒に移動しません。(ホットスポットは、あなたが描いた新しい場所にはありません)

実際の解決策は2つだけです。

1)独自のItemizedOverlayWithFocusクラスにItemizedOverlayWithFocus.draw()とItemizedOverlayWithFocus.onDrawItem()を再実装します。(onDrawItem()、onDrawCar()を呼び出し、代わりにオーバーライドされたdraw()メソッドから呼び出すだけです)

描画されるマーカーのオフセットを変更したい場合を除いて、それは価値がありません。たとえば、タワーアイコンがあり、下から10ピクセルをYポイントにして、タワーがGeoPointの端ではなく、GeoPoint上に立っているように見せたいとします。

2)最初にビットマップから独自のマーカーを作成し、OverlayItem.setMarker()メソッドで描画可能なマーカーとして設定します。Canvasを使用してビットマップを作成してみてください。

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
// Draw on your car on the canvas...

次に、ビットマップを割り当ててみてください。

overlayItem.setMarker(new BitmapDrawable(bitmap));

他のものを描画する場合を除いて、draw()をオーバーライドしないでください。また、super.draw()を使用する場合は、マーカーとそのホットスポットがジェスチャで機能するようにしてください。

于 2012-12-11T01:23:19.843 に答える
0

このコードも試すことができます

Drawable newMarker = this.getResources().getDrawable(R.drawable.ic_marker);

this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
            newMarker, "listener try null", new DefaultResourceProxyImpl(getActivity()));

mapView.getOverlays().add(mMyLocationOverlay);
于 2013-03-26T03:17:55.897 に答える