В марте этого года компания 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"); MotionRangerange= 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
Источник:developer.sonymobile.com
Перевод:Александр Ледков