スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MapViewのItemizedOverlay

ついにMapをいじり始めることに。
というわけで、ItemizedOverlayに対して、タッチイベントをかましたい。
そんな場合に、onTapの2種類
onTap(GeoPoint p, MapView mapView)
onTap(int index)
でやります。

onTap(GeoPoint p, MapView mapView)でsuper呼んでやると(もしアイテムのタップと判断された場合に)
onTap(int index)が呼ばれるといった動作。
なので、superを呼ぶタイミングはメソッドの先頭がよさそうですね。
あたり判定だったら後続の処理をしない様にするなど。

たとえばマップ上をタップするとピンをうち、ピンをタップしたら何か表示するような場合などは、
その場にまたピンうたれても困りますよね。



ただ、ここで注意点なので、ピンチ操作の最後1本が画面を離れる際にもonTapが呼ばれちゃうんですね。
というわけで、onTouchEventを見てこの時の挙動を見てみます。

onTourchEvent:ACTION_DOWN
onTourchEvent:ACTION_POINTER_2_DOWN
onTourchEvent:ACTION_MOVE
onTourchEvent:ACTION_MOVE
onTourchEvent:ACTION_POINTER_2_UP※順番によっては、POINTER_1_UP
onTourchEvent:ACTION_UP


こんな感じ。最後ActionUpなのがポイントといったところでしょうか。
ひとまずは、Pointer_2_downでフラグをたてて、フラグが立っている場合にAction_upが呼ばれたら、ピンチの最後の挙動として判定、super.onTouchEventを呼ばずに、trueを返してやる。みたいな感じにすて対応を確認。
なんかバージョン間の差異がありそうな方法でいやですね。
e.getPointerCount()なんかの指の数で見てもいいかもしれないですね。当然onTap側でフラグをハンドリングしてもいいかも。



あともう一つはまったのが、初期のアイテムが空の場合にNullPointerExceptionが発生する事。
しかも自分コードのスタックがないのでどこで発生するのかわからんという・・・
とりあえずStackOverflowに書いてあったとおり、
コンストラクタの最後にpolulate()としてやるといいらしいです。

public TapOverlay(Drawable defaultMarker) {
  //中心に合わせる。ほかにピンみたいな場合は、boundCenterButtomなど
  super(boundCenter(defaultMarker));
  //初期状態のOverlayが空の場合にヌルポが発生するのでおまじない。
  populate();
}
関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。