Страницы

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

понедельник, 1 октября 2018 г.

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

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

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


Ответ

В итоге у меня получилось все это сделать и все отлично работает. Хотя я не понимаю, почему в доступе нет примеров я думаю что это не должно быть такой редкостью.
Вот специально для тех кому может это пригодиться я собрал проект с реализацией и выложил на 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 плавно перемещался, он должен как бы плавать, а так получается, что он прыгает. Если кто то знает как это сделать подскажите

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

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