Я подключил акселерометр который отслеживает положение телефона(угол наклона верхней части устройства от пользователя или к нему) и в зависимости от этого позволяет либо не позволяет делать те или иные действия. Так вот вопрос в том, подскажите как можно визуально показать юзеру такую плавающую точку(индикатор положения) как на строительном уровне, когда наклоняешь телефон пузырек движется либо вверх либо вниз в зависимости от стороны наклона, что то вроде кастромного 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 <?xml version="1.0" encoding="utf-8"?>
Вот только еще б хотелось, чтоб thumb плавно перемещался, он должен как бы плавать, а так получается, что он прыгает. Если кто то знает как это сделать подскажите