2011-01-21 9 views
0

私はMapViewを使用するAndroidアプリケーションを開発しています。地図の表示部分が変わるたびに手続きを実行したいのですが、新しい緯度と経度の値を手続きに渡したいと思います。MapViewのLat/Lonウィンドウが変更されたときを判断する正しい方法は何ですか?

私はonInterceptTouchEventをオーバーライドできると思っていましたが、プロシージャは最初に画面に触れたときに実行されるように見えました(例えば、ドラッグすることでパンニングするなど、ドラッグ操作の開始時にプロシージャを呼び出すだけです)。つまり、プロシージャは新しい座標で呼び出されることはありません。

だから、正しい方法は何ですか?

答えて

2

多分、あなたが望むものを達成するためにいくつかのテクニックを組み合わせなければならないでしょう。

パンニングをキャッチするには、MapViews onTouchEvent()またはdispatchTouchEvent()をオーバーライドして、MotionEvent.ACTION_UPイベントを待機します。ユーザが画面から指を持ち上げたときにこれがトリガーされます。

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction()==MotionEvent.ACTION_UP) { 
    // Call your procedure here 
    } 

    return super.onTouchEvent(ev); 
} 

あなたはパンの間にあなたのプロシージャを呼び出すしたい場合は、私はあなたが2つの同じ方法のいずれかをオーバーライドパンの動きを見ていると思います。

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_MOVE) { 
    if (event.getHistorySize() < 1) 
     return; // First call, no history 

    // Get difference in position since previous move event 
    float diffX = event.getX() - event.getHistoricalX(event.getHistorySize() - 1); 
    float diffY = event.getY() - event.getHistoricalY(event.getHistorySize() - 1); 

    if (Math.abs(diffX) > 0.5f || Math.abs(diffY) > 0.5f) { 
     /* Position has changed substantially, so this is probably a drag action. 
     Call your procedure here. */ 
    } 
    } 
} 

あなたがdispatchDrawを上書きすることができ、ズームレベルの変化を検出する:これは組み込みのイベントでなければなりませんように

int oldZoomLevel=-1; 

public void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 

    if (getZoomLevel() != oldZoomLevel) { 
    // Call your procedure here 

    oldZoomLevel = getZoomLevel(); 
    } 
} 
+0

がようだが、私はいくつかの取扱いと一緒に住んでますね。このような何かそれらの.. ..ありがとう! – Mzzzzzz

関連する問題