Доступ к необработанным данным с сенсорной панели Glass возможен с помощью Android SDK.
Однако GDK предоставляет детектор жестов, который автоматически обнаруживает распространенные жесты на Glass, включая касание, пролистывание и прокрутку.
Кроме того, простые жесты по умолчанию преобразуются в события D-pad для упрощения обработки без использования детектора жестов.
Обнаружение жестов как событий клавиш D-pad
По умолчанию система Glass преобразует простые жесты в события клавиш D-pad. Это позволяет вам прослушивать события onKeyDown()
и onKeyUp()
в действиях или представлениях, чтобы обрабатывать следующие жесты как клавиши D-pad:
- Нажмите переводится как
KEYCODE_DPAD_CENTER
. - Нажатие кнопки камеры преобразуется в
KEYCODE_CAMERA
. - Проведите пальцем вниз, чтобы получить
KEYCODE_BACK
.
Следующий фрагмент определяет, когда пользователи нажимают на сенсорную панель:
public class MyActivity extends Activity {
...
@Override
public boolean onKeyDown(int keycode, KeyEvent event) {
if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
// user tapped touchpad, do something
return true;
}
...
return super.onKeyDown(keycode, event);
}
}
Метод обнаружения касаний отдельных представлений заключается в реализации OnClickListener
для представления. Когда пользователи касаются сенсорной панели (переводится как нажатие центральной кнопки D-pad) с видом в фокусе, представление может обрабатывать событие с помощью OnClickListener
.
public final class MyActivity extends Activity implements OnClickListener {
View cardView;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
cardView = new Card(this).setText("Tap to carry out an action").getView();
// To receive touch events from the touchpad, the view should be focusable.
cardView.setOnClickListener(this);
cardView.setFocusable(true);
cardView.setFocusableInTouchMode(true);
setContentView(cardView);
}
@Override
protected void onResume() {
// To receive touch events from the touchpad, the view should have focus.
cardView.requestFocus();
super.onResume();
}
@Override
public void onClick(View v) {
// perform desired action
}
}
Обнаружение жестов с помощью детектора жестов
Детекторы жестов позволяют обнаруживать как простые жесты, так и более сложные жесты, например те, которые выполняются несколькими пальцами или прокруткой. Сложные жесты не имеют соответствующей клавиши D-pad.
GestureDetector предоставляет интерфейсы прослушивателя, которые можно реализовать для получения уведомлений о жесте .
Обнаружение жестов на уровне активности
Обнаружение жестов на уровне активности уместно, когда вам не важно, какая часть вашего пользовательского интерфейса находится в фокусе. Например, если вы хотите вызывать меню, когда пользователи касаются сенсорной панели, независимо от того, какое представление находится в фокусе, вы должны обрабатывать MotionEvent
внутри действия.
Следующий пример:
- Создает
GestureDetector
, реализующий прослушиватели для обработки распознанных жестов. - Переопределяет метод
onGenericMotionEvent()
действия, чтобы передавать события движения методуonMotionEvent()
детектора жестов.
Когда происходит событие движения, система передает его детектору жестов. В случае распознавания детектор жестов уведомляет соответствующий прослушиватель о необходимости обработки события.
public class MainActivity extends Activity {
private GestureDetector mGestureDetector;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
mGestureDetector = createGestureDetector(this);
}
private GestureDetector createGestureDetector(Context context) {
GestureDetector gestureDetector = new GestureDetector(context);
//Create a base listener for generic gestures
gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
@Override
public boolean onGesture(Gesture gesture) {
if (gesture == Gesture.TAP) {
// do something on tap
return true;
} else if (gesture == Gesture.TWO_TAP) {
// do something on two finger tap
return true;
} else if (gesture == Gesture.SWIPE_RIGHT) {
// do something on right (forward) swipe
return true;
} else if (gesture == Gesture.SWIPE_LEFT) {
// do something on left (backwards) swipe
return true;
}
return false;
}
});
gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
@Override
public void onFingerCountChanged(int previousCount, int currentCount) {
// do something on finger count changes
}
});
gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
@Override
public boolean onScroll(float displacement, float delta, float velocity) {
// do something on scrolling
}
});
return gestureDetector;
}
/*
* Send generic motion events to the gesture detector
*/
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
if (mGestureDetector != null) {
return mGestureDetector.onMotionEvent(event);
}
return false;
}
}
Обнаружение жестов на уровне просмотра
Обнаружение жестов на уровне представления уместно, когда вы хотите делать разные вещи в зависимости от того, какое представление находится в фокусе.
Следующий пример:
- Создает пользовательское представление, которое переопределяет метод
dispatchGenericFocusedEvent()
. Когда происходит событие движения, этот метод передает событие движения детектору жестов. - Объявляет представление фокусируемым, чтобы оно обнаруживало события, когда оно имеет фокус.
- Создает
GestureDetector
, реализующий прослушиватели для обработки распознанных жестов.
Когда детектор жестов распознает движение, когда изображение находится в фокусе, детектор жестов вызывает соответствующий прослушиватель.
/**
* TextView that handles touchpad input (currently only TAP).
*/
public class TouchpadHandlingTextView extends TextView
implements OnAttachStateChangeListener{
private final GestureDetector mTouchDetector;
public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchDetector = createGestureDetector(context);
// must set the view to be focusable
setFocusable(true);
setFocusableInTouchMode(true);
}
public TouchpadHandlingTextView(Context context) {
this(context, null);
}
@Override
public void onViewAttachedToWindow(View v) {
requestFocus();
}
@Override
public void onViewDetachedFromWindow(View v) {
}
/**
* Pass a MotionEvent into the gesture detector
*/
@Override
public boolean dispatchGenericFocusedEvent(MotionEvent event) {
if (isFocused()) {
return mTouchDetector.onMotionEvent(event);
}
return super.dispatchGenericFocusedEvent(event);
}
/**
* Create gesture detector that triggers onClickListener. Implement
* onClickListener in your Activity and override
* onClick() to handle the "tap" gesture.
*/
private GestureDetector createGestureDetector(Context context) {
GestureDetector gd = new GestureDetector(context);
gd.setBaseListener(new GestureDetector.BaseListener() {
@Override
public boolean onGesture(Gesture gesture) {
if (gesture == Gesture.TAP) {
return performClick();
}
return false;
}
});
return gd;
}
}