2017-03-14 28 views
1

MapBoxのAndroid SDKで地図の動きが完全に終了したことを検出しようとしています。完全な意味では、私はユーザーのやりとり(タッチ)やカメラの動き(タッチの動きや飛び出しの慣性)を意味しません。MapBox Androidの動きの完全な終了を検出する

SDKには、このようなコールバックが存在しないように、私はMapViewOnTouchListenerOnMapChangedListenerので(Kotlinでなく、かなり明確な)のような上の2人のリスナーを合成:

mapView.setOnTouchListener { _, event -> 
    when (event.actionMasked) { 
     MotionEvent.ACTION_DOWN -> { 
      listener?.onMapDragBegin() 
     } 
     MotionEvent.ACTION_UP -> { 
      listener?.onMapDragEnd() 
     } 
    } 
    false 
} 

mapView.addOnMapChangedListener { c -> 
    when (c) { 
     MapView.REGION_WILL_CHANGE, MapView.REGION_WILL_CHANGE_ANIMATED -> { 
      listener?.onMapMovementBegin() 
     } 
     MapView.REGION_DID_CHANGE, MapView.REGION_DID_CHANGE_ANIMATED -> { 
      listener?.onMapMovementEnd() 
     } 
    } 
} 

両方のイベントを持っているリスナーが待機終了しました。 1つの小さなディテールを除いて、これは非常にうまくいきます。羽ばたくときに、ユーザーが画面に触れなくても終了イベントが送信され、REGION_WILL_CHANGE_ANIMATEDマップ変更が呼び出された後にのみ表示されます。地図がまだ動いているかどうかわからない瞬間があります。ログに次のように表示されます。

19:23:42.431: Map touch started 
19:23:42.537: Map region change started 
19:23:42.538: Map region change ended 
... 
19:23:42.570: Map region change started 
19:23:42.570: Map region change ended 
19:23:42.577: Map touch ended 
19:23:42.577: Map movement ended at -122,420511, 37,748315 
// Both touch and movement now have ended according to the MapView 
// Fling inertia begins 
19:23:42.582: Map region change started 
19:23:43.154: Map region change ended 
19:23:43.154: Map movement ended at -122,424123, 37,741793 

移動が終了した後にAPI呼び出しを行う必要があります。地図が再び動き始めると、それは大きな問題ではないので、私はアクティブな呼び出しをキャンセルしますが、SDKがこの呼び出し/キャンセル/呼び出しを避ける方法を提供しているかどうかを知りたいと思います。例えば、私は動きの終わりにスクロール速度をチェックすることを考えましたが、それにアクセスする方法は見つけられません。

+1

SDKは、各fling呼び出しのために呼び出される 'OnFlingListener'を公開します。 MapChangeイベントに関連して、 'DID_FINISH_RENDERING_FRAME_FULLY_RENDERED'のような他のイベントがあります。 – Tobrun

+1

@Tobrun忘れてしまいましたが、すでに' OnFlingListener'を調べましたが、全く役に立たない、 'REGION_WILL_CHANGE_ANIMATED'(飛行慣性からの地域変更) 。私はちょうど 'DID_FINISH_RENDERING_FRAME_FULLY_RENDERED'を試してみましたが、それも使用できません(私はそれが個々のタイルのためだと信じています)。残念ながら、 'RENDERING_MAP_FULLY ...'のような他のイベントもfling中に複数回送信されます。 – Jukurrpa

答えて

0

最新のバージョンのSDKに表示されるような方法OnCameraIdleListenerがあります。カメラの動きが終了したときに呼び出されます。

+0

v5.1.0で追加されましたが、問題は、最初にタッチが終了したときに2回呼び出されるということです慣性が始まり、その後慣性が終了する。だから、タイマーは最初のものを除外するのにまだ必要です。 – Jukurrpa

+0

二度呼ばれたのは奇妙です。タッチが終了したときにメソッドが呼び出されずにカメラがまだ動いている場合、より論理的であると思われるので、なぜこのように実装されているのだろうかと思います。 – fdermishin

関連する問題