Google Map Androidで特定の速度(kmph単位)でマーカーをアニメーション化する方法。特定の速度でLatLngの配列の間でマーカーを移動する
私はインターネットで広く利用可能なanimateMarkerメソッドを試しました。 LatLng点のセットを移動できますが、特定の速度では移動できません。
誰かがあなたがここにPhysics
を使用する必要がありますKMPH
Google Map Androidで特定の速度(kmph単位)でマーカーをアニメーション化する方法。特定の速度でLatLngの配列の間でマーカーを移動する
私はインターネットで広く利用可能なanimateMarkerメソッドを試しました。 LatLng点のセットを移動できますが、特定の速度では移動できません。
誰かがあなたがここにPhysics
を使用する必要がありますKMPH
内の特定の速度でオブジェクトを移動するには私を助けることができます。以下は、役に立つアルゴリズムのような詳細です。
Velocity
が17 km/hr
で、最初と最後の位置の間の距離が10 km
の場合、時間は3600 sec
または3600000 ms
となります。Array
の各地域の時間を分割してください。あなたがArray
で100個の要素を持っている場合は、それぞれの場所の間の時間が今36 sec
または36000 ms
に設定した時間でHandler
を定義し、この期間内にマーカーをアニメーション化しようと36 sec
または36000 ms
Handler
や、API
によって提供されるデフォルトのメソッドを使用することができます。毎回次の場所に配列の要素があることを思い出してください。NOTE
私も例を見つけました。元の投稿はhereを参照してください。
public void animateMarker(final Marker marker, final LatLng toPosition,
final boolean hideMarker) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = mGoogleMapObject.getProjection();
Point startPoint = proj.toScreenLocation(marker.getPosition());
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 500;
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed
/duration);
double lng = t * toPosition.longitude + (1 - t)
* startLatLng.longitude;
double lat = t * toPosition.latitude + (1 - t)
* startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
} else {
if (hideMarker) {
marker.setVisible(false);
} else {
marker.setVisible(true);
}
}
}
});
}
誰でも助けてください。
これを達成するために同じ方法を変更しました。私たちは、
animateMarker(googleMap, driver, arrayPoints, distance(arrayPoints.get(0), arrayPoints.get(1)) * msForKMTravel, 0);
arrayPointsこのメソッドを呼び出す必要が
は、緯度経度の配列です。 msForKMTravelは、KMをトラブリングするためのmicroSecです。
方法:::
public void animateMarker(final GoogleMap mMap, final Marker marker, final List<LatLng> arrayLications, final double duration, final int step) {
Log.d(TAG, "Moving from:" + step + "To:" + (step + 1) + "duration" + duration);
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
LatLng startPosition = arrayLications.get(step);
final LatLng toPosition = arrayLications.get(step + 1);
Projection proj = mMap.getProjection();
Point startPoint = proj.toScreenLocation(startPosition);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) (elapsed
/duration));
Log.d(TAG, "interpolator t:" + t + "start :" + start + " elapsed :" + elapsed);
double lng = t * toPosition.longitude + (1 - t)
* startLatLng.longitude;
double lat = t * toPosition.latitude + (1 - t)
* startLatLng.latitude;
LatLng newLatLng = new LatLng(lat, lng);
Log.d(TAG, "Moving to" + newLatLng);
marker.setPosition(newLatLng);
if (t < 1.0) {
handler.postDelayed(this, 100);
} else {
if (arrayLications.size() > step + 2 && isVisible()) {
double distance = distance(arrayLications.get(step + 1), arrayLications.get(step + 2));
double time = distance * msForKMTravel;
Log.d(TAG, "Go for distance" + distance + " in time " + time);
animateMarker(mMap, marker, arrayLications, time, step + 1);
}
}
}
});
}
この質問のために利用できるよりよい解決策があるかどうかわからないと私は答えとしてこれをマークすることはできません。 – Pavandroid