Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Как реализовать индикатор положения телефона?

#java #android


Я подключил акселерометр который отслеживает положение телефона(угол наклона верхней
части устройства от пользователя или к нему) и в зависимости от этого позволяет либо
не позволяет делать те или иные действия.

Так вот вопрос в том, подскажите как можно визуально показать юзеру такую плавающую
точку(индикатор положения) как на строительном уровне, когда наклоняешь телефон пузырек
движется либо вверх либо вниз в зависимости от стороны наклона, что то вроде кастромного
seekbar



Может как то установить лисенер на seekbar и через сетер передавать ему значения
с акселерометра таким образом ползунок должен будет двигаться... 

Но мне кажется должны быть более правильные решения, во всяком случае на телефонах
есть стандартная настройка "Настроить калибровку" и там реализовано это хорошо, но как? 
    


Ответы

Ответ 1



В итоге у меня получилось все это сделать и все отлично работает. Хотя я не понимаю, почему в доступе нет примеров я думаю что это не должно быть такой редкостью. Вот специально для тех кому может это пригодиться я собрал проект с реализацией и выложил на Git , я новичок, так что может вы найдете как это можно улучшить, но во всяком случае это работает. Сейчас индикатор показывает положение относительно оси Z , но там все подготовлено под оси X и Y . надеюсь кому то еще поможет и если что то можете подсказать как улучшить Вот как это все сделано Main activity public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { private VerticalSeekBar seekBar1; private SensorManager sensorManager; private Sensor sensorAccel; private Sensor sensorLinAccel; private Sensor sensorGravity; private static float axisX; private static float axisY; private static float axisZ; private Timer timer; private static int seekBarFloatingPoint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initVar(); startTip(); } private void initVar() { seekBar1 = (VerticalSeekBar) findViewById(R.id.seekBar); seekBar1.setOnSeekBarChangeListener(this); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensorAccel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorLinAccel = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); sensorGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); } private SensorEventListener listener = new SensorEventListener() { @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { axisX = event.values[0]; axisY = event.values[1]; axisZ = event.values[2]; } } }; @Override protected void onStop() { super.onStop(); sensorManager.unregisterListener(listener); timer.cancel(); } private void startTip() { sensorManager.registerListener(listener, sensorAccel, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(listener, sensorLinAccel, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(listener, sensorGravity, SensorManager.SENSOR_DELAY_NORMAL); timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { int convert = (int) (axisZ * 100); int i = 500; seekBarFloatingPoint = i + convert; seekBar1.setProgress(seekBarFloatingPoint); } }); } }; timer.schedule(task, 0, 200); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { seekBar1.setProgress(seekBarFloatingPoint); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } Потом XML файлы со стилями в папке drawable progress background_fill progress_fill styleseekbarcamera styleseekbarthumb styleseekbardivider Вот только еще б хотелось, чтоб thumb плавно перемещался, он должен как бы плавать, а так получается, что он прыгает. Если кто то знает как это сделать подскажите

Ответ 2



Так а что Вам мешает: Создать свой компонент Принцип его работы просто - в контейнер, кладёте например картинку и задаёте ей позиционирование при приходе событий с акселерометра. Пункт первый в принципе не обязателен, но для кошерного решения необходим.

Комментариев нет:

Отправить комментарий