Создание Android компаса с помощью датчика ориентации устройства
Главная » Создание Android компаса с помощью датчика ориентации устройства

В прошлых уроках мы уже осваивали работу с некоторыми датчиками, которыми оборудованы современные Android устройства. Мы недавно уже сделали фонарик и можем отыскать дорожку в темном переулке, осталось только найти себе путь, куда идти, и сегодня мы над этим поработаем, создав программу Компас, работающую с датчиком ориентации. Наш будущий компас будет (как и полагается) указывать на север и при смене положения устройства в элементе TextView в интерфейсе программы будет в градусах показываться отклонение положения устройства от севера. Примечательно, что программа легко работает и на довольно старых устройствах 2010-х годов, о чем их владельцы могут и не догадываться (как я например). Помню, как владелец iPhone 4 хвастался наличием компаса на своем яблоке, а я со своим Galaxy Gio был в печали, думая, что мой аппарат такими возможностями не обладает. Но оказалось то, что обладает, всего то не было еще соответствующего распространенного ПО! И созданный здесь компас отлично работает и на нем в том числе.

Создаем новый проект, выбираем Blank Activity, минимальная версия Android 2.2. Приложение будет состоять из одного xml файла и одного java класса. 

Настроим внешний вид нашего будущего компаса в файле activity_main.xml. Добавим сюда 2 элемента: TextView для отображения градуса отклонения от севера, а также ImageView, который будет отображать изображение компаса:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:background="#FFFFFF">
 <TextView
 android:id="@+id/Header"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerHorizontal="true"
 android:layout_marginBottom="40dp"
 android:layout_marginTop="20dp"
 android:text="Отклонение от севера: 0.0"
 android:layout_gravity="center"/>
 <ImageView
 android:id="@+id/CompassView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@+id/tvHeading"
 android:layout_centerHorizontal="true"
 android:src="@drawable/compass_rus"
 android:layout_gravity="center"/>
</LinearLayout>

Картинка, которую я использовал для компаса:

Изображение компаса

Вы при желании можете использовать любое другое изображение и поместить его в папку res/drawable

Теперь немного теории. Как было упомянуто в начале урока, работа компаса в этом приложении основана на использовании датчика ориентации Android устройства. Доступ к использованию функционала датчика происходит через использование объекта SensorManager. Через SensorManager программисты получают доступ ко всем установленным на устройство датчикам: гироскоп, акселерометр, датчик освещения, барометр, датчик магнитных полей и другие, которых в современных аппаратах просто уйма, ведь сейчас смартфоны научились уже даже измерять пульс владельца. Доступ к необходимому датчику осуществляется через команду .getDefaultSensor (),в которой указывается тип датчика, к которому получается доступ. В нашем случае эта команда выглядит так:

.getDefaultSensor(Sensor.TYPE_ORIENTATION)

Также в приложении используется слушатель изменений показаний датчика (SensorEventListener), поэтому наше приложение должно выполнять этот интерфейс:

public class MainActivity extends Activity implements SensorEventListener {

Сами датчики не понимают, когда им пора на упокой, поэтому необходимо использовать методы onResume () и onPause (), чтобы указывать, когда приложение должно работать, а когда датчики могут быть свободны:). Если это не сделать, то датчик будет усердно трудиться и при закрытии программы, что уменьшит время работы устройства на несколько часов по причине стремительного разряда батареи. 

Метод onSensorChanged () фиксирует изменения показаний датчика ориентации при его отклонении от севера, которому мы присваиваем значение 0 градусов. При повороте устройства в любую сторону в элементе TextView будет динамически отображаться изменение положения устройства в пространстве по отношению к северу в градусах.

Открываем файл MainActivity.java и добавляем все, о чем было упомянуто выше:

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity implements SensorEventListener {

 //Объявляем картинку для компаса
 private ImageView HeaderImage;
 //Объявляем функцию поворота картинки
 private float RotateDegree = 0f;
 //Объявляем работу с сенсором устройства
 private SensorManager mSensorManager;
 //Объявляем объект TextView
 TextView CompOrient;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 //Связываем объект ImageView с нашим изображением:
 HeaderImage = (ImageView) findViewById(R.id.CompassView);

 //TextView в котором будет отображаться градус поворота:
 CompOrient = (TextView) findViewById(R.id.Header);

 //Инициализируем возможность работать с сенсором устройства:
 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
 }

 @Override
 protected void onResume() {
 super.onResume();

 //Устанавливаем слушателя ориентации сенсора
 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
 SensorManager.SENSOR_DELAY_GAME);
 }

 @Override
 protected void onPause() {
 super.onPause();

 //Останавливаем при надобности слушателя ориентации
 //сенсора с целью сбережения заряда батареи:
 mSensorManager.unregisterListener(this);
 }

 @Override
 public void onSensorChanged(SensorEvent event) {

 //Получаем градус поворота от оси, которая направлена на север, север = 0 градусов:
 float degree = Math.round(event.values[0]);
 CompOrient.setText("Отклонение от севера: " + Float.toString(degree) + " градусов");

 //Создаем анимацию вращения:
 RotateAnimation rotateAnimation = new RotateAnimation(
 RotateDegree,
 -degree,
 Animation.RELATIVE_TO_SELF, 0.5f,
 Animation.RELATIVE_TO_SELF,
 0.5f);

 //Продолжительность анимации в миллисекундах:
 rotateAnimation.setDuration(200);

 //Настраиваем анимацию после завершения подсчетных действий датчика:
 rotateAnimation.setFillAfter(true);

 //Запускаем анимацию:
 HeaderImage.startAnimation(rotateAnimation);
 RotateDegree = -degree;

 }

 @Override
 public void onAccuracyChanged(Sensor sensor, int accuracy) {
 //Этот метод не используется, но без него программа будет ругаться
 }
}

Все, давайте скомпилируем проект и протестируем приложение (можно и не компилировать, а протестировать через реальное устройство, подключенное к Android Studio). Запускаем и видим:

Запущенное приложение компас

Работает, надеюсь у вас все также получилось, удачи!

Категория: Уроки программирования | Просмотров: 1919 | Добавил: Oleg | Теги: делаем Android компас, датчик ориентации, компас, Android программирование | Рейтинг: 3.0/4
Всего комментариев: 0
avatar