В марте этого года компания Sony выпустила смартфон Xperia Sola. Одной из основных фишек смартфонов стала технология Floating touch, которая позволяет определять положение пальца на расстоянии нескольких миллиметров от экрана. В промо ролике телефона показано, как живые обои телефона реагируют на приближение пальца. К сожалению, на момент выход аппарата практически не было программ, использующих эту технологию. Исключение составлял разве что встроенный браузер. Между тем, реализация поддержки Floating touch в своем приложении - довольно простая задача. Прежде чем приступить к описанию работы с Floating touch API следует сказать, что Floating touch работает, начиная с четвертой версии Android (Ice Cream Sandwich).
Одним из рекомендуемых способов применения Floating touch является подсвечивание элементов управления, над которыми находится палец. Щелчок мимо ссылок или кнопок, особенно когда они находятся в куче, довольно частая и раздражающая ситуация. Подсвечивание активного элемента управления, над которым находится палец, позволит более точно целиться и избегать неверных щелчков.
Программирование андроид приложений с использованием Floating touch API не представляет большого труда. Для отслеживания положения пальца над экраном нужно использовать класс MotionEvent, в котором определено три действия (action): ACTION_HOVER_ENTER, ACTION_HOVER_MOVE, ACTION_HOVER_EXIT. Нам нужно просто переопределить метод View.onHoverEvent или Activity.dispatchGenericMotionEvent. Из соображений совместимости и корректности работы приложения настоятельно рекомендуется проверять действие и отрабатывать как касания, так и перемещения над экраном.
Помимо привычных координат, задающих положение пальца, при работе с Floating touch нам доступен еще один параметр, определяющий расстояние от экрана. Частая ошибка начинающих разработчиков - указание точной дистанции. На практике пользователь никогда не будет держать палец на расстоянии 2,0мм от экрана. Рука трясётся, и палец то удаляется, то приближается к экрану, поэтому разумно проверять попадание его в диапазон расстояний. Это можно сделать с помощью метода InputDevice.getMotionRange. Еще одна особенность Floating touch заключается в том, что она задает расстояние в неких относительных единицах, не привязанных жестко к расстоянию. Дело в том, что в основе Floating touch лежит измерение емкости, а на изменение емкости влияет не только расстояние до экрана, но и толщина пальца, угол, под которым он подносится, температура окружающей среды. Так что физически невозможно определить точное расстояние до пальца. В среднем Floating touch начинает работать где-то на расстоянии одного см от экрана.
Для того, чтобы проверить, поддерживается ли Floating touch телефоном, можно использовать метод PackageManager.hasSystemFeature, которому в качестве параметра передать com.sonymobile.floating_touch.
Следующий пример перехватывает события Floating touch и выводит сообщения в TextView.
@Override
public boolean dispatchGenericMotionEvent(MotionEvent ev) {
StringBuffer output = new StringBuffer();
output.append("action: " + ev.getActionMasked() + "\n");
output.append("x: " + ev.getX() + "\n");
output.append("y: " + ev.getY() + "\n");
MotionRange range = ev.getDevice().getMotionRange(MotionEvent.AXIS_DISTANCE);
if (range != null) {
output.append("distance: " + ev.getAxisValue(MotionEvent.AXIS_DISTANCE) + "\n");
output.append("distance min: " + range.getMin() + "\n");
output.append("distance max: " + range.getMax() + "\n");
}
if (mHasFloatingtouch == null) {
mHasFloatingtouch = getPackageManager().hasSystemFeature(
"com.sonymobile.floating_touch");
}
output.append("has floating touch: " + mHasFloatingtouch);
if (mTextOutput == null) {
mTextOutput = (TextView) findViewById(R.id.textView1);
}
mTextOutput.setText(output);
return mHasFloatingtouch;
} Автор: Andreas Sandblad, Software Architect, Sony
|
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.