Эта статья пригодится тем, кто хочет запрограммировать продвинутое сенсорное управление в своем приложении на android. Как показывает практика, интерфейс, построенный на взаимодействии с сенсорным экраном, очень прост, понятен и удобен. 
     Существует 2 способа запрограммировать взаимодействие с сенсорным экраном: в activity и внутри кода отдельного компонента. Второе обычно полезнее, поскольку тогда один раз запрограммированный компонент будет всегда слушаться нужных жестов.  
    Итак, для отлавливания касаний экрана в activity, нужно ввести в ее код следующий метод (eclipse предложит имплементировать интерфейс onTouchListener):
public boolean onTouch(View arg0, MotionEvent arg1) {
      //code
 }
 В коде компонента следует аналогичное действие делается так:
 public boolean onTouchEvent(MotionEvent event){
      //code
 }
   Аргументами методов служат:
 1)Компонент arg0(только в первом случае), над которым и было совершено касание
 2)arg1 (во втором случае он называется event) – специальный класс, содержащий кучу параметров и типе прикосновения к сенсорному экрану — координаты, силу нажатия, тип нажатия
    Основные методы класса MotionEvent:
    Методы getX() и getY() возвращают координаты нажатия.  
  Метод getAction() возвращает тип нажатия пользователем. При проектировании приложения буз мультитача возможны следубщие его значения:
  -константа ACTION_DOWN : пользователь опускает палец на экран
  -константа ACTION_UP : юзер поднимает палец с экрана
  -константа ACTION_MOVE : пользователь перемещает палец по экрану.
  Таким образом, если юзер проведет пальцем по дисплею, аозникнет целая куча событий onTouch : сначала ACTION_DOWN, затем некоторое количество ACTION_MOVE, затем ACTION_UP.
    В более сложном случае, когда в управлении используется мультитач, типов событий больше (внимание, программирование мультитача имеет также один важный недостаток — его невозможно протестировать на эмуляторе):
  ACTION_POINTER_1_UP – поднятие 1-го пальца
  ACTION_POINTER_2_UP – поднятие 2-го пальца
  ACTION_POINTER_1_DOWN – отпускание 1-го пальца
  ACTION_POINTER_2_DOWN – отпускание 2-го пальца
    Узнать количество пальцев на экране можно методом event.getPointerCount(). Координаты n-го пальца(считая от 0) находят методами getX(n) и getY(n)
    Теории достаточно, давайте программировать мультитач. Условимся, что мы его будем реализовывать в компоненте.  
 Реализуем следующий несложный интерфейс — двумя пальцами осуществляется просто масштабирование без переноса(чтобы не усложнять пример). Алгоритм таков:
    Пусть синие кресты — положение пальцев в момент времени 2, а красные — в момент времени 1 при их перемещении. Нам нужно рассчитать расстояния между пальцами в оба момента времени (curS и prevS – свойства компонента) и сравнить их — их отношение и будет масштабным коэффициентом.  
   Нам, при этом, правда, придется как-то разделять различные акты масштабирования. Нам же не хочется, чтобы после масштабирования и отпускания пальцев при следующем масштабировании расстояние сравнивалось с последним из другого акта.  
   Для этой цели не следует выполнять масштабирование, если prevS=0 && curS=0. Тогда нужно просто определить сами расстояния. В начале же акта надо обязательно обнулить эти значения. Код обработчика события:
if (event.getPointerCount()==2){
    double dx;
     double dy;
     if (event.getAction()==event.Action_MOVE){
     if (prevS==0 && curS==0){
                 dx=event.getX(0)-event.getX(1);
                 dy=event.getY(0)-event.getY(1);
                 curS=Math.sqrt(dx*dx+dy*dy);
                 prevS=curS;               
        }
        else{
                 prevS=curS;  
                 dx=event.getX(0)-event.getX(1);
             dy=event.getY(0)-event.getY(1);
             curS=Math.sqrt(dx*dx+dy*dy);
                                        //Масштабирование с помощью curS и prevS
        }
     }
     if (event.getAction()==event.ACTION_POINTER_2_DOWN){
     curS=0;
                  prevS=0;
     }
}

Комментариев нет:
Отправить комментарий