Я подключил акселерометр который отслеживает положение телефона(угол наклона верхней части устройства от пользователя или к нему) и в зависимости от этого позволяет либо не позволяет делать те или иные действия.
Так вот вопрос в том, подскажите как можно визуально показать юзеру такую плавающую точку(индикатор положения) как на строительном уровне, когда наклоняешь телефон пузырек движется либо вверх либо вниз в зависимости от стороны наклона, что то вроде кастромного 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 плавно перемещался, он должен как бы плавать, а так получается, что он прыгает. Если кто то знает как это сделать подскажите
Комментариев нет:
Отправить комментарий