Es posible acceder a datos sin procesar desde el panel táctil de Glass con el SDK de Android.
Sin embargo, el GDK proporciona de gestos que detecta automáticamente gestos comunes en Glass, como tocar, deslizar y desplazarse.
Además, los gestos simples se traducen en Eventos de pad direccional de forma predeterminada para un procesamiento fácil sin con un detector de gestos.
Detección de gestos como eventos de teclas del pad direccional
De forma predeterminada, el sistema Glass traduce gestos simples en eventos clave del pad direccional. Esta
te permite escuchar
onKeyDown()
y onKeyUp()
eventos en actividades o vistas para procesar los siguientes gestos como teclas del pad direccional:
- Presiona lo que se traduce a
KEYCODE_DPAD_CENTER
. - Presionar el botón de la cámara se traduce en
KEYCODE_CAMERA
. - Deslizar hacia abajo se traduce en
KEYCODE_BACK
.
El siguiente fragmento detecta cuando los usuarios presionan el panel táctil:
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);
}
}
Un método para detectar toques en vistas individuales es implementar
OnClickListener
para la vista. Cuando los usuarios presionan el panel táctil (traducido como un clic en el botón central de un pad direccional)
con la vista enfocada, esta puede controlar el evento con una
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
}
}
Cómo detectar gestos con un detector de gestos
Los detectores de gestos también te permiten detectar gestos simples como gestos más complejos, como las que usan varios dedos o el desplazamiento. Complejos los gestos no tienen una tecla del pad direccional correspondiente.
GestureDetector ofrece interfaces de objetos de escucha que puedes implementar para recibir la notificación de un gesto.
Cómo detectar gestos a nivel de la actividad
Es apropiado detectar gestos a nivel de la actividad
cuando no te importa qué parte de la IU
esté enfocado. Por ejemplo, si quieres que aparezca un menú
cuando los usuarios presionan el panel táctil, independientemente de la vista enfocada,
debes procesar el MotionEvent
dentro de la actividad.
En el ejemplo siguiente, se realizan estas acciones:
- Crea un
GestureDetector
. que implementa objetos de escucha para procesar gestos reconocidos. - Anula el método
onGenericMotionEvent()
de la actividad para pasar los eventos de movimiento al detector de gestosonMotionEvent()
.
Cuando ocurre un evento de movimiento, el sistema lo pasa al detector de gestos. Si reconocido, el detector de gestos notifica al objeto de escucha apropiado para que procese el evento.
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;
}
}
Cómo detectar gestos a nivel de la vista
La detección de gestos en el nivel de la vista es apropiada cuando queremos hacer cosas diferentes según la vista que esté enfocada.
En el ejemplo siguiente, se realizan estas acciones:
- Crea una vista personalizada que anula la
dispatchGenericFocusedEvent()
. Cuando se produce un evento de movimiento, este método pasa el evento de movimiento al detector de gestos. - Declara la vista como enfocable para que detecte eventos cuando está enfocada.
- Crea un
GestureDetector
que implementa. y objetos de escucha para procesar gestos reconocidos.
Cuando el detector de gestos reconoce un movimiento mientras la vista está en foco, llama al objeto de escucha correspondiente.
/**
* 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;
}
}