Я работаю над приложением для отслеживания транспортных средств и пытаюсь добиться плавной анимации движения автомобиля, без «прыжков» и непрерывного движения карты с текущим местоположением.
Предоставлено местоположение 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
Плавное GPS-отслеживание с помощью карт Google ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1729967252
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);
}
}
});
}```
Подробнее здесь: [url]https://stackoverflow.com/questions/79129217/smooth-gps-tracking-with-google-maps[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия