J2J.RU - cовременная система продвижения сайтов
Меню сайта

Категории раздела

Наш опрос
Меня больше интересуют приложения и игры для:
Всего ответов: 22

Файлы
Новые Популярные Лучшие


Теги
Android (34)
uCoz (8)
mobile (3)
sistem (3)
xml (3)
google (2)
html (2)
Oboi (2)
opera (2)
Rest (2)
soap (2)
action (1)
ajax (1)
App2SD (1)
apps (1)
CSS (1)
Ddms (1)
editor (1)
gmail (1)
gobook (1)
java (1)
legend (1)
Lite (1)
live (1)
mp3 (1)
mrtm (1)
Muse (1)
ninja (1)
pdf (1)
php (1)
Root (1)
sensor (1)
shazam (1)
sql (1)
thread (1)
touch (1)
UI (1)
Widget (1)
Worms (1)
Xplore (1)
Zirco (1)

RSS
  
Новостная лента.

Форумная лента.

Файловая лента.  

Главная » Статьи » Программинг » Программирование [ Добавить статью ]

Работа с датчиком ускорений в Android

Замечательной особенностью современных смартфонов является их богатое оснащение вспомогательными системами: камера, GPS приемник, встроенные датчики поворота, акселерометры. Все это богатство существенно расширяет горизонты функционального применения телефона. В Этой статье я расскажу об использовании сенсоров, а точнее датчика ускорения, в Android. Мы разработаем простую программу, которая меняет цвет заднего фона, когда Вы трясете телефон.


Работа со встроенными датчиками в Android осуществляется через класс SensorManager. Получить доступ к экземпляру этого класса можно через метод getSystemService(SENSOR_SERVICE). Внутри класса Sensor определено несколько констант, определяющих тип используемого сенсора:

  •     Sensor.TYPE_GYROSCOPE - гироскоп (датчик поворота)
  •     Sensor.TYPE_MAGNETIC_FIELD - магнитное поле
  •     Sensor.TYPE_ORIENTATION - ориентация
  •     Sensor.TYPE_ACCELEROMETER - акселерометр

Для доступа к сенсору используется метод sensorManager.getDefaultSensor(), который в качестве параметров принимает указанный выше тип датчика и константу, определяющую частоту опроса датчика:

  • SENSOR_DELAY_FASTEST - получать данные так часто, насколько это вообще возможно;
  • SENSOR_DELAY_GAME - режим, пригодный для использования в играх.
  • SENSOR_DELAY_NORMAL - этот режим используется по умолчанию. Частота опроса датчиков позволяет использовать их для фиксации факта поворота телефона.
  • SENSOR_DELAY_UI - этот режим предназначен для решения задач пользовательского интерфейса.

Указанные режимы приведены в порядке уменьшения частоты опроса датчиков.

После того, как Вы получили объект, представляющий сенсор, Вы должны зарегистрировать для него класс, реализующий интерфейс SensorEventListener, то есть содержащий метод обработки событий, генерируемых сенсорами. 
public void onSensorChanged(SensorEvent event)
 
Работа с сенсорами не представляет ничего сложного. Давайте для  напишем приложение, которое будет менять цвет фона при тряске. Создайте новое приложение и назовите главную деятельность SensorTestActivity.

Приведите шаблон дизайна res/layout/main.xml к виду

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
 
 <TextView
 android:id="@+id/textView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:text="Shake to get a toast and to switch color" />
 
</LinearLayout>

Как видите, мы добавили TextView и растянули его на весь экран.

Перейдем к редактированию файла с исходным кодом src\SensorTestActivity.java. Добавим в класс приватное поле sensorManager, которе будет отвечать за работу с датчиком, логическое поле color, которое будет индикатором текущего цвета фона, поле view для работы с TextView и переменную lastUpdate, которая будет хранить время последнего изменения состояния датчика.

private SensorManager sensorManager; //Объект для работы с датчиком
private boolean color = false; //Индикатор текущего цвета: false-зеленый, true - красный.
private View view; //Ссылка на TextView
private long lastUpdate; //Время последнего изменения состояния датчика

Внутри конструктора класса создадим объект sensorManager, предназначенный для работы с датчиками. После этого зарегистрируем класс, внутри которого будут реализованы методы, вызываемые при изменении состояния датчика. Делаеся это с помощью метода sensorManager.registerListener. В качестве первого параметра укажем ссылку на текущий класс (то есть на SensorTestActivity), второй параметр определяет интересующий нас датчик, третий - режим работы датчика.  После регистрации класса инициализируем переменную lastUpdate, записав туда текущее время.

 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 view = findViewById(R.id.textView);
 view.setBackgroundColor(Color.GREEN);
 //Создаем объект, для работы с датчиками
 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
 //Регистрируем класс, где будет реализован метод, вызываевый при изменении
 //состояния датчика.
 sensorManager.registerListener(this,
 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
 SensorManager.SENSOR_DELAY_NORMAL);
 lastUpdate = System.currentTimeMillis();
 }

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

 @Override
 protected void onResume() {
 super.onResume();
 // register this class as a listener for the orientation and
 // accelerometer sensors
 sensorManager.registerListener(this,
 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
 SensorManager.SENSOR_DELAY_NORMAL);
 }
 
 @Override
 protected void onPause() {
 // unregister listener
 super.onPause();
 sensorManager.unregisterListener(this);
 }

Нам осталось реализовать метод onSensorChanged(SensorEvent event), который обрабатывает изменения состояния датчиков. Во первых, мы будем обрабатывать только события от аксилерометра. Значения проекции ускорения на оси системы координат, связанной с телефоном можно получить из массива event.values. В переменную accelationSquareRoot записываем квадрат модуля ускорения телефона, деленный на квадрат ускорения свободного падения. Чем больше значение этой переменной, тем сильнее пользователь трясет телефон. Чтобы избежать случайных срабатываний, будем менять фон TextView только если пользователь трясет телефон дольше, чем 200 миллисекунд.

 public void onSensorChanged(SensorEvent event) {
 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
 float[] values = event.values;
 // проекции ускорения на оси системы координат
 float x = values[0];
 float y = values[1];
 float z = values[2];
 
 // квадрат модуля ускорения телефона, деленный на квадрат 
 //ускорения свободного падения
 float accelationSquareRoot = (x * x + y * y + z * z)
 / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
 //Текущее время
 long actualTime = System.currentTimeMillis();
 
 if (accelationSquareRoot >= 2) //Если тряска сильная
 {
 if (actualTime - lastUpdate < 200) {
 //Если с момента начала тряски прошло меньше 200 
 // миллисекунд - выходим из обработчика
 return;
 }
 lastUpdate = actualTime;
 //Меняем цвет
 if (color) {
 view.setBackgroundColor(Color.GREEN);
 } else {
 view.setBackgroundColor(Color.RED);
 }
 color = !color;
 }
 }
 
 }

Некоторого пояснения требует на мой взгляд значения, содержащиеся в массиве event.values. Система координат, связанная с телефоном показана на рисунке. Если вы положите телефон на стол и начнете двигать его ускорено вправо, то значение event.values[0] (проекция ускорения на ось x) будет положительным; если влево - отрицательным. Даже если телефон лежит неподвижно на столе, датчик ускорения фиксирует воздействие гравитационной силы и event.values[2]=9.81.


    
Вот собственно и все. Как видите, работа с акселерометром является довольно простым делом. Исходник класса можно скачать тут: SensorTestActivity.java.

Александр Ледков
Источники: http://www.mobilab.ru

Категория: Программирование | Добавил: Virus (29.11.2012)

Похожие темы на пост "Работа с датчиком ускорений в Android"

Схожие темы выбранные по тегам : sensor, Android, датчиком, программирование, работа, датчик, ускорений
  
Просмотров: 1397 | Рейтинг: 0.0/0

Дорогие пользователи и гости сайта!!! Пожалуйста, если вам не сложно, оставте комментарий или ваше мнение о портале в Гостевой книге. Ваше мнение очень важно для нас и очень поможет в поиске дальнейшего пути развития сайта. С уважением, Администрация сайта AndroBum!



Так же рекомендуем:
Всего комментариев: 0
Информация:
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

[ Регистрация | Вход ]
Поиск

Мини-чат

Block title
Virus
файлов: 69
Постов: 38
Комментов: 1005
Репутация: 0
Ранг:

droid
файлов: 3
Постов: 0
Комментов: 0
Репутация: 100
Ранг:

Serge
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Sergey
файлов: 1
Постов: 0
Комментов: 0
Репутация: 0
Ранг:

Аватар не установлен! Blackfoxxx
файлов: 0
Постов: 0
Комментов: 0
Репутация: 0
Ранг:


Друзья сайта
  • Официальный блог
  • скрипты, шаблоны, html, css
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Статистика Сайта
    Статистика сайта как на сайте

    Пользователей всего: +0
    Материалов всего [?]: +
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Гости сайта Пользователи

    Яндекс.Метрика




    Пользователи онлайн:


    Flag Counter



    Все материалы размещенные на сайте принадлежат их владельцам.
    Copyright dodomo.do.am © 2010-2012