Главная » Создание 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). Запускаем и видим: Работает, надеюсь у вас все также получилось, удачи! | |
|
Всего комментариев: 0 | |