2

Google マップ API を使用しています。ユーザーがマップをドラッグした後、マップの中心の位置を取得しようとするコードがいくつかあります。

MapView mv = ...;

mv.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint pt = mv.getMapCenter();
            //do something with the point
            return A;
        }
        return B;
    }
});

今私の問題は戻り値にあります:

  • ACTION_DOWNBがfalseの場合、マップはドラッグされますが、イベントのみが表示され、ACTION_UPトリガーされることはありません-理解しています
  • B が true の場合、ACTION_UPイベントを受け取りますが、マップはドラッグされません
  • A が true か false かで違いはないようです

私が欲しいのは、ACTION_UPイベントを受け取り、マップをドラッグすることです。

ここで何が欠けていますか?

4

2 に答える 2

2

ここに1つの解決策があります:デフォルトのMapViewを使用する代わりに、GestureDetectorを持つカスタムMapViewを使用します。基本的に、これにより、マップのカスタムイベントリスナーを作成でき、ドラッグなどを台無しにする問題を回避できます。さらに、デフォルトの MapView と比較して膨大な数のインタラクション オプションがあります。数か月前、私は同様の問題に直面していたので、今述べた解決策を実装することにしました。TapControlledMapView と呼ばれるカスタム MapView のコードと、カスタム リスナーのインターフェイスのコードが下部に示されています: http://pastebin.com/kUrm9zFg

したがって、リスナーを実装するには、mapactivity クラスで次のコードを使用するだけです (ああ、これを知らなかった場合は、カスタムを使用しているため、MapActivity レイアウト XML ファイルで次を宣言する必要があります)。マップビュー:

<?xml version="1.0" encoding="utf-8"?>
//The bottom line was the tricky business (You get ClassCastExceptions and whatnot)
<NAMEOFYOURPROJECT.TapControlledMapView (ex: com.android.googlemapsapp.TapControlledMapView)
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="API_KEY_HERE"
/>

MapActivity クラスで次のコードを使用します。

mapView.setOnSingleTapListener(new OnSingleTapListener() {

@Override
 public boolean onSingleTap(MotionEvent arg1) {
 if(arg1.getAction() == MotionEvent.ACTION_UP)
 {
  GeoPoint pt = mv.getMapCenter();
  // do something with the point.
  return ***true***;
 }
return true;
});

それがどうなるか教えてください。

于 2012-08-30T00:23:38.217 に答える
0

@ViswaPatel のアイデアに従って、onTouchEventメソッドをオーバーライドし、独自のリスナーを管理するMapView を拡張する新しい MapView クラスを作成します。

public class CustomMapView extends MapView {

    private OnTouchListener lst;

    public CustomMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomMapView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomMapView(Context context, String apiKey) {
        super(context, apiKey);
    }

    public void setOnActionUpListener(OnTouchListener lst) {
        this.lst = lst;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        if (lst != null && event.getAction() == MotionEvent.ACTION_UP) {
            lst.onTouch(this, event); // return value ignored
        }
        return true;
    }
}

呼び出しコードは次のとおりです。

  mv.setOnActionUpListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            final GeoPoint pt = mv.getMapView().getMapCenter();
            //doing my stuff here
            return true; //ignored anyway
        }
    });
}
于 2012-08-30T21:03:01.747 に答える