Опубликован: 10.04.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Северный (Арктический) федеральный университет им. М.В. Ломоносова
Самостоятельная работа 5:

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

< Лекция 5 || Самостоятельная работа 5: 12 || Самостоятельная работа 6 >

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

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

  1. Создадим простое приложение и добавим на форму TextView для вывода информации.
  2. Настроим логику приложения. В 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;
  }
}
    
Листинг 10.1. Распознавание поддерживаемых жестов с помощью реализации интерфейсов

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;
  }
}

}
    
Листинг 10.2. Распознавание жестов с использованием класса GestureDetector.SimpleOnGestureListener.
< Лекция 5 || Самостоятельная работа 5: 12 || Самостоятельная работа 6 >
Марат Нуриджанян
Марат Нуриджанян

Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html).

Там скачать можно только Android Studio

Владимир Каункин
Владимир Каункин

В самостоятельной работе 2 в примере решения задания некорректно загадывается число (в двух местах), выбирая случайное целое число из диапазона [0, 99] вместо [1, 100], как того требует условие. Кроме того, загадывание числа всё таки лучше вынести в отдельный метод, как мне кажется.
 

Денис Адериха
Денис Адериха
Беларусь
Юрий Гиль
Юрий Гиль
Беларусь, г. Поставы