Подтвердить что ты не робот

Отображение направления места со стрелкой в ​​Android ListView

У меня есть требование показать список некоторых мест в Android ListView с направлением этого места. Я могу это найти угол между местоположениями, но проблема в том, что My Client потребовал, чтобы стрелка была повернута, когда устройство было повернуто или перемещено. Я не нашел решения, которое будет вращать стрелку в соответствии с изменениями датчика. Выполняет ли какое-либо из них такое требование? Пожалуйста, предложите мне некоторое решение, чтобы получить список, который будет отображаться в этом iPhone App. или посмотрите на изображение ниже.

ОБНОВЛЕНО:

Я ожидаю ответа, так что будет полезно приступить к выполнению нижеследующего требования. Даже показ только стрелки приветствуется, поэтому я попытаюсь достичь ниже. все образцы, которые я сделал, дрожат, и они нестабильны.

enter image description here

4b9b3361

Ответ 1

У вашего адаптера есть коллекция объектов со всей информацией, которую вы хотите в каждом списке   , включая значение поплавка для вращения стрелки.

public class Place {
 private Srting name;
 private double distance;
 private float arrowAngle;

//-- etc etc--

Адаптер переопределения getView(), установите вращение стрелки. Вид:

@Override
public View getView(View currentView, int position, ViewGroup parent){
  //--inflate layout for each row, find views, set values etc etc--

  Place p = getItem(position);
  arrowView.setRotation(p.getArrowAngle());

 //--return inflated view --
}

При изменении датчика, вычислите новый угол каждой стрелки и обновите каждый из объектов данных в своем адаптере.

for (int i = 0 ; i < adapter.getCount(); i++){
    Place p = adapter.getItem(i);

   //--calculate angle--

   p.setArrowAngle(newAngle);
}

adapter.notifyDataSetChanged();

Это сделало бы это, но датчики могут измениться очень быстро, и слишком много обновлений данных ListView заставит ListView отставать, ограничить обновления, объявить переменную long lastUpdated, изменить чувствительность датчика, если System.nanoTime() - lastupdated > 500, то вызывается только вышеуказанный код обновления. Это ограничит обновление до 500 миллисекундного интервала.

Ответ 2

В обработчике событий изменения датчика вызовите ListView.invalidateViews(). Это приведет к перерисовке всех существующих представлений в ListView. Итак, если вы в настоящий момент находитесь в том месте, где вы можете правильно нарисовать список и получать события от датчиков, как вам нравится, то добавление этого вызова должно привести к поведению, которое вы хотите.