Введение в разработку приложений для ОС Android

Демонстрации распознавания стандартных жестов

Показывать лекцию целиком

Цель лабораторной работы:

разработать простейшие приложения для демонстрации распознавания стандартных жестов.

Задачи лабораторной работы:

  • рассмотреть распознавание всех поддерживаемых жестов;
  • рассмотреть распознавание только части поддерживаемых жестов.
  • 10.1 Введение

    Для работы со стандартными жестами Android предоставляет класс GestureDetector. Этот класс содержит два вложенных интерфейса-слушателя: OnGestureListener и OnDoubleTapListener, эти интерфейсы задают методы, отслеживающие стандартные жесты. А также GestureDetector содержит вложенный класс SimpleOnGestureListener, который содержит пустые реализации, возвращающие значение false, где это необходимо, всех методов интерфейсов: OnGestureListener и OnDoubleTapListener.

    В лабораторной работе рассмотрим две возможности распознавания жестов:

  • случай распознавания всех поддерживаемых жестов, для этого реализуем в классе активности оба интерфейса;
  • случай распознавания только некоторого набора поддерживаемых жестов, для этого в классе активности объявим внутренний класс-наследник класса GestureDetector.SimpleOnGestureListener.
  • 10.2 Распознавание всех поддерживаемых жестов

    Разработаем приложение, в котором продемонстрируем распознавание всех поддерживаемых жестов. Приложение содержит одну активность, одно информационное поле для вывода информации о распознанном жесте. Приложение работает следующим образом: пользователь выполняет один из поддерживаемых сенсорных жестов, в информационном поле отображается информация о распознанном жесте.

  • Создадим простое приложение и добавим на форму TextView для вывода информации.
  • Настроим логику приложения. В java класс, соответствующий активности внесем следующие дополнения.
  • Класс активности должен реализовывать интерфейсы: GestureDetector.OnGestureListener и GestureDetector.OnDoubleTapListener, для этого в объявление класса добавим конструкцию:
    implements GestureDetector.OnGestureListener,
                GestureDetector.OnDoubleTapListener
            
  • Нам понадобится экземпляр класса GestureDetectorCompat поэтому в качестве поля класса активности объявим следующую переменную:
    GestureDetectorCompat mDetector;
            
  • В методе onCreate() класса активности, создадим экземпляр класса GestureDetectorCompat и присвоим его переменной mDetector:

    mDetector = new GestureDetectorCompat(this,this);
        

    одним из параметров конструктора является класс, который реализует интерфейс GestureDetector.OnGestureListener, в нашем случае использовано слово this, т. е. параметром является сам класс активности. Этот интерфейс уведомляет пользователей когда появляется определенное сенсорное событие.

    В методе OnCreate() класса активности, следующая строка:

    mDetector.setOnDoubleTapListener(this);
        

    устанавливает слушатель событий, связанных с двойным касанием, это должен быть класс, реализующий интерфейс GestureDetector.OnDoubleTapListener. В нашем случае использовано слово this, т.е. слушателем будет опять сам класс активности.

  • Чтобы позволить вашему объекту GestureDetector получать события, необходимо переопределить метод onTouchEvent() для активности или элемента GUI. И передавать в экземпляр детектора все обнаруженные события.
    public boolean onTouchEvent(MotionEvent event){ 
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        return super.onTouchEvent(event);
    }
          
  • После проведенной подготовки пришло время реализовать все методы, объявленные в интерфейсах, отвечающих за прослушивание сенсорных событий.
  • Методы интерфейса GestureDetector.OnGestureListener:

    onDown() - отслеживает появление касания, т. е. палец прижат к экрану;
    onFling() - отслеживает появление жеста смахивания;
    onLongPress() - отслеживает удерживание пальца прижатым к экрану длительное время;
    onScroll() - отслеживает появление жеста прокрутки (пролистывания);
    onShowPress() - отслеживает, что произошло событие касания и больше никаких событий не происходит короткое время;
    onSingleTapUp() - отслеживает появление жеста одиночного нажатия (клик).

    Методы интерфейса GestureDetector.OnDoubleTapListener:

    onDoubleTap() - отслеживает появление жеста двойного нажатия ("двойной клик");
    onDoubleTapEvent() - отслеживает появление события во время выполнения жеста двойного нажатия, включая касание, перемещение, подъем пальца.
    onSingleTapConfirmed() - отслеживает появление жеста одиночного нажатия (клик).

    В листинге 10.1 представлен код приложения, в котором распознаются все поддерживаемые жесты, информация о появившемся и распознанном жесте выдается в информационное поле (TextView).

    В качестве практики предлагается воспроизвести данное приложение и проверить, как система распознает тот или иной жест. Очень полезно для понимания, как выполняются основные жесты.

    10.3 Распознавание только части поддерживаемых жестов

    Разработаем приложение, в котором продемонстрируем распознавание только некоторой части поддерживаемых жестов по выбору программиста. Мы рассмотрим распознавание жеста смахивания (fling). Приложение содержит одну активность, одно информационное поле для вывода информации о распознанном жесте. Приложение работает следующим образом: пользователь выполняет один из поддерживаемых сенсорных жестов, в информационном поле отображается информация о распознанном жесте.

  • Создадим простое приложение и добавим на форму TextView для вывода информации.
  • Настроим логику приложения. В java класс, соответствующий активности внесем следующие дополнения.
  • Нам понадобится экземпляр класса GestureDetectorCompat поэтому в качестве поля класса активности объявим следующую переменную:

    GestureDetectorCompat mDetector;
        

    В методе onCreate() класса активности, создадим экземпляр класса GestureDetectorCompat и присвоим его переменной mDetector:

    mDetector=new GestureDetectorCompat(this, new MyGestListener());
        

    в конструкторе аргументом, отвечающим за отслеживание сенсорных событий, служит экземпляр класса MyGestListener() - внутренний класс, который является наследником класса GestureDetector.SimpleOnGestureListener.

    Имеет смысл немного рассмотреть класс GestureDetector.SimpleOnGestureListener. Этот класс реализует интерфейсы GestureDetector.OnGestureListener и GestureDetector.OnDoubleTapListener, все методы заявленные в интерфейсах в этом классе имеют пустую реализацию и те, которые должны возвращать значение, возвращают false. Поэтому для распознавания какого-то события или некоторого подмножества событий достаточно написать реализацию соответствующих методов, в классе наследнике.

    В листинге 10.2 представлен код приложения, в котором распознается только жест смахивания, т. е. реализован метод onFling(), информация о появившемся и распознанном жесте выдается в информационное поле (TextView). В качестве слушателя используется экземпляр класса MyGestListener(), являющийся наследником класса GestureDetector.SimpleOnGestureListener.

    Получить больше информации о распознавании жестов можно по ссылке: http://developer.android.com/training/gestures/index.html

    package com.example.lab5_1_gestall;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.support.v4.view.GestureDetectorCompat;
    import android.view.*;
    import android.widget.*;
    
    public class MainActivity extends Activity 
           implements GestureDetector.OnGestureListener,
                      GestureDetector.OnDoubleTapListener
    {
      TextView tvOutput;
      GestureDetectorCompat mDetector;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tvOutput = (TextView)findViewById(R.id.textView1);
        
        mDetector = new GestureDetectorCompat(this,this);
        mDetector.setOnDoubleTapListener(this);
      }
    
      public boolean onTouchEvent(MotionEvent event){ 
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        return super.onTouchEvent(event);
          }
        
      @Override
      public boolean onDown(MotionEvent event) { 
          tvOutput.setText("onDown: " + event.toString()); 
          return false;
      }
        
      @Override
      public boolean onFling(MotionEvent event1, MotionEvent event2, 
                     float velocityX, float velocityY) {
        tvOutput.setText("onFling: " + event1.toString()+event2.toString());
          
          return true;
      }
      
      @Override
      public void onLongPress(MotionEvent event) {
         tvOutput.setText("onLongPress: " + event.toString()); 
      }
      
      @Override
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                        float distanceY) {
         tvOutput.setText("onScroll: " + e1.toString()+e2.toString());
           return true;
      }
      
      @Override
      public void onShowPress(MotionEvent event) {
         tvOutput.setText("onShowPress: " + event.toString());
      }
      
      @Override
      public boolean onSingleTapUp(MotionEvent event) {
        tvOutput.setText("onSingleTapUp: " + event.toString());
          return true;
      }
      
      @Override
      public boolean onDoubleTap(MotionEvent event) {
        tvOutput.setText("onDoubleTap: " + event.toString());
          return true;
      }
      
      @Override
      public boolean onDoubleTapEvent(MotionEvent event) {
        tvOutput.setText("onDoubleTapEvent: " + event.toString());
          return true;
      }
      
      @Override
      public boolean onSingleTapConfirmed(MotionEvent event) {
         tvOutput.setText("onSingleTapConfirmed: " + event.toString());
          return true;
      }
    }
        

    package com.example.lab5_1_gestsubset;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.support.v4.view.*;
    import android.view.*;
    import android.widget.*;
    
    public class SubsetGestActivity extends Activity {
      
    private GestureDetectorCompat mDetector; 
    private TextView tvOut;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_subset_gest);
      mDetector = new GestureDetectorCompat(this, new MyGestListener());
      tvOut = (TextView)findViewById(R.id.textView1);
    }
    
    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
    this.mDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
    }
          
    class MyGestListener extends GestureDetector.SimpleOnGestureListener {
          
    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2, 
                      float velocityX, float velocityY) {
    tvOut.setText("onFling: " + event1.toString()+event2.toString());
       return true;
      }
    }
    
    }
        
    Вернуться к учебному плану