Главная » Разработка для Android » Создание приложения для измерения перегрузки

0

Вы можете создать  простой  инструмент  для измерения перегрузки, суммируя  ускорение  по всем трем направлениям и сравнивая получен- ный результат  с ускорением  свободного падения.  В следующем примере вы разработаете  простой  прибор  для измерения перегрузки,  используя

акселерометр  для определения ускорения,  которое  испытывает данное устройство.

Благодаря силе земного притяжения ускорение устройства в состоянии покоя равняется 9,8 м/с2 и направлено к центру Земли. В этом примере1 вы определите влияние силы притяжения с помощью константы SensorManager. STANDARD_GRAVITY.

1. Начните с создания нового проекта Forceometer с одноименной Актив- ностью. Отредактируйте ресурс разметки main.xml, чтобы отображать по центру две строки с жирным  текстом, который  будет содержать текущую и максимальную зафиксированные перегрузки:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent">

<TextView android:id="@+id/acceleration" android:gravity="center" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="32sp" android:text="CENTER" android:editable="false" android:singleLine="true" android:layout_margin="10px"/>

/>

<TextView android:id="@+id/maxAcceleration" android:gravity="center" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="40sp" android:text="CENTER" android:editable="false" android:singleLine="true" android:layout_margin="10px"/>

/>

</LinearLayout>

2. Внутри Активности Forceometer создайте поля для хранения ссылок на оба элемента  TextView  и на объект SensorManager. Кроме того, сде- лайте поле для записи последнего максимального зафиксированного значения  ускорения:

SensorManager sensorManager; TextView accelerationTextView; TextView maxAccelerationTextView; float currentAcceleration = 0; float maxAcceleration = 0;

1    Все фрагменты кода в этом примере — часть проекта G-Forceometer из главы 14, их можно загрузить с сайта Wrox.com.

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

private final SensorEventListener sensorEventListener = new

SensorEventListener() {

double calibration = SensorManager.STANDARD_GRAVITY;

public void onAccuracyChanged(Sensor sensor, int accuracy) { }

public void onSensorChanged(SensorEvent event) {

double x = event.values[0]; double y = event.values[1]; double z = event.values[2];

double a = Math.round(Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)));

currentAcceleration = Math.abs((float)(a-calibration));

if (currentAcceleration > maxAcceleration)

maxAcceleration = currentAcceleration;

}

};

4. Обновите  метод onCreate, чтобы с помощью SensorManager зареги- стрировать  новый объект SensorEventListener для фиксации изме- нений в показаниях акселерометра. Воспользуйтесь возможностью получить ссылки на оба элемента TextView:

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

accelerationTextView = (TextView)findViewById(R.id.acceleration); maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ ACCELEROMETER);

sensorManager.registerListener(sensorEventListener, accelerometer,

SensorManager.SENSOR_DELAY_FASTEST);

}

5. Акселерометр может иметь высокую чувствительность, поэтому об- новление  элементов  интерфейса при каждом изменении ускорения способно оказаться очень затратным. Чтобы этого избежать, создайте новый метод updateGUI, который синхронизируется с графическим потоком в зависимости от срабатывания таймера, прежде чем обнов- лять элементы TextView:

private void updateGUI() {

runOnUiThread(new Runnable() {

public void run() {

String currentG = currentAcceleration/SensorManager.STANDARD_GRAVITY

+ "Gs"; accelerationTextView.setText(currentG); accelerationTextView.invalidate();

String maxG = maxAcceleration/SensorManager.STANDARD_GRAVITY + "Gs";

maxAccelerationTextView.setText(maxG);

maxAccelerationTextView.invalidate();

}

});

};

6. В завершение  обновите метод onCreate, запуская  таймер для обнов- ления пользовательского интерфейса каждые 100 мс:

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

accelerationTextView = (TextView)findViewById(R.id.acceleration); maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

Sensor accelerometer =

sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorManager.registerListener(sensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);

Timer updateTimer = new Timer("gForceUpdate");

updateTimer.scheduleAtFixedRate(new TimerTask() {

public void run() {

updateGUI();

}

}, 0, 100);

}

Закончив писать  код, вы явно захотите  его проверить.  Лучше  всего данное приложение было бы тестировать на борту истребителя F-16, вы- полняющего фигуры высшего пилотажа над Атлантикой. Но подобные эксперименты, как известно, иногда плохо кончаются, поэтому за неиме- нием боевого самолета можете поэкспериментировать с бегом или ездой по району.

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

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

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии