2011年3月31日木曜日

Android MapViewでクリックイベント取得

MapViewをクリックした時に、その場所のジオコードを取得し、そのジオコードを元にいろんなAPIをたたきたい、ということでやってみたが、結構はまったのでいかに記載。

とりあえず最初に以下のようにMapViewのOnClickListenerのEventを取得するようにした。


@Override
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  MapView mapView = (MapView)findViewById(R.id.mapView);
                mapView.setBuiltInZoomControls(true);
                mapView.setOnTouchListener(new OnTouchListener() {
   public boolean onTouch(View v, MotionEvent event) {
    GeoPoint point = mapView.getMapCenter(); // TODO 自動生成されたメソッド・スタブ
    lati = point.getLatitudeE6() / 1E6;
    lon = point.getLongitudeE6() / 1E6;


    // ここでAPIよびだし!!

    mMapController.animateTo(point);
    Log.d(TAG, "click lati=" + lati + " lon=" + lon);
    return false;
   }
  });
しかししかーし、OnTouchイベントは1回しかこない!
ちなみにOnTouchをTrueにしてリターンすると、それ以降の処理を受け付けれなくなった。
また、OnClickListenerでもいけるかな!?と思ったけどEventすら受け付けなかった。

ちなみに画面をタップした時にその場所にアイコンを表示するために、Overlayクラスを実装していた。
うーむ、とあれこれbreakを張って見ているとどうもOverlayクラスにはEventが来ていた。

おおー、じゃこっちでとればいいじゃん、ということでOverlayで取得するように変更!
以下ソース。

public class IconOverlay extends Overlay {
 Bitmap mIcon;
 int mOffsetX;
 int mOffsetY;

 GeoPoint mPoint;

 IconOverlay(Bitmap icon, GeoPoint point){
  mIcon = icon;
  mOffsetX = 0 - icon.getWidth() / 2;
  mOffsetY = 0 - icon.getHeight() / 2;
  mPoint = point;

 }


 @Override
    public boolean onTap(GeoPoint geopoint, MapView mapview) {
     mPoint = geopoint;
        // ここでAPIをよびだし!!!
     return super.onTap(geopoint, mapview);
    }

 @Override
    public void draw(Canvas canvas, MapView mapview, boolean shadow) {
  super.draw(canvas, mapview, shadow);

  if (!shadow){
   Projection projection = mapview.getProjection();
   Point point = new Point();
   projection.toPixels(mPoint, point);
   point.offset(mOffsetX, mOffsetY);

   canvas.drawBitmap(mIcon, point.x, point.y, null);
  }
 }

}

0 件のコメント: