Плавное GPS-отслеживание с помощью карт GoogleAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Плавное GPS-отслеживание с помощью карт Google

Сообщение Anonymous »

Я работаю над приложением для отслеживания транспортных средств и пытаюсь добиться плавной анимации движения автомобиля, без «прыжков» и непрерывного движения карты с текущим местоположением.
Предоставлено местоположение GPS. каждую секунду, чего явно недостаточно для плавного взаимодействия.
Я решил, что могу интерполировать между двумя последними заданными местоположениями, обновлять местоположение маркера и перемещать карту каждые 16 мс, чтобы создать переход со скоростью 60 кадров в секунду из каждого заданного местоположения, который бы приводит к плавному движению.
Проблема в том, что это невероятно расходует батарею, забирая эмулятор 70% процессора компьютера.
Я пытался изменить его на 20 и даже 10 кадров в секунду, но ничего страшного разница.
Приложение Waze обеспечивает именно то, к чему я стремлюсь, потребляя при этом 30–40% ресурсов ЦП.
Есть идеи, как добиться этого, не перегружая телефон?
Это мой текущий код, который потребляет много ресурсов ЦП. :
if(fusedLocationClient != null && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
{

locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
Location location = locationResult.getLastLocation();

//Place current location marker
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
if(mLastLocation == null)
{
mLastLocation = latLng;
mCurrLocationMarker = Helper.setCustomMarker(MapsActivity.this, latLng, mMap);
locationUpdater = new LocationUpdater(mMap, MapsActivity.this, mCurrLocationMarker);
}
mCurrLocationMarker.setRotation(calculateBearing(mLastLocation, latLng));

//mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,18), ANIMATION_TIME, null);
animateMarker(mLastLocation, latLng);

mLastLocation = latLng;
//move map camera

}
};

LocationRequest locationRequest = LocationRequest.create();
locationRequest.setInterval(ANIMATION_TIME);
locationRequest.setFastestInterval(ANIMATION_TIME/2);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}
public void animateMarker(final LatLng startPosition, final LatLng toPosition) {

final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();

final long duration = ANIMATION_TIME;
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)
* startPosition.longitude;
double lat = t * toPosition.latitude + (1 - t)
* startPosition.latitude;
LatLng latLng = new LatLng(lat, lng);
mCurrLocationMarker.setPosition(latLng);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,18));

if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
}
}
});
}```



Подробнее здесь: https://stackoverflow.com/questions/791 ... oogle-maps
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»