O acesso a dados brutos no touchpad do Glass é possível com o SDK do Android.
No entanto, o GDK oferece que é um detector de gestos, detecta automaticamente gestos comuns no Google Glass, incluindo tocar, deslizar e rolar.
Além disso, gestos simples são traduzidos em eventos D-pad por padrão para facilitar o processamento sem usando um detector de gestos.
Detectar gestos como eventos de tecla do botão direcional
Por padrão, o sistema do Google Glass traduz gestos simples em eventos de tecla do botão direcional. Isso
permite que você ouça
onKeyDown()
e onKeyUp()
eventos em atividades ou visualizações para processar os seguintes gestos como teclas do botão direcional:
- Toque em traduz para
KEYCODE_DPAD_CENTER
. - O pressionamento do botão da câmera significa
KEYCODE_CAMERA
. - Deslizar para baixo traduz para
KEYCODE_BACK
.
O snippet abaixo detecta quando os usuários tocam no touchpad:
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);
}
}
Um método para detectar toques em visualizações individuais é implementar
OnClickListener
para a visualização. Quando os usuários tocam no touchpad (traduzido como um clique no botão central do botão direcional)
com a visualização em foco, ela pode manipular o evento com uma
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
}
}
Como detectar gestos com um detector de gestos
Os detectores de gestos também permitem detectar gestos simples como gestos mais complexos, como aqueles que usam vários dedos ou rolagem. Complexos gestos não têm uma tecla D-pad correspondente.
O GestureDetector fornece interfaces de listener que podem ser implementadas receber notificações sobre um gesto.
Como detectar gestos no nível da atividade
Detectar gestos no nível da atividade é apropriado
quando você não se importa com qual parte da interface
tem foco. Por exemplo, se você quiser abrir um menu
quando os usuários tocam no touchpad, independentemente da visualização em foco,
você lidaria com MotionEvent
dentro da atividade.
No exemplo a seguir:
- Cria um
GestureDetector
. que implementa listeners para processar gestos reconhecidos. - Substitui o método
onGenericMotionEvent()
da atividade para transmitir os eventos de movimento ao métodoonMotionEvent()
.
Quando ocorre um evento de movimento, o sistema o passa para o detector de gestos. Se reconhecido, o detector de gestos notifica o listener apropriado para o 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;
}
}
Como detectar gestos no nível da visualização
A detecção de gestos no nível da visualização é apropriada quando você fazer coisas diferentes dependendo da visualização em foco.
No exemplo a seguir:
- Cria uma visualização personalizada que substitui a
dispatchGenericFocusedEvent()
. Quando ocorre um evento de movimento, esse método passa o evento de movimento para o detector de gestos. - Declara a visualização como focalizável para que ela detecte eventos quando tiver foco.
- Cria um
GestureDetector
que implementa para processar gestos reconhecidos.
Quando o detector de gestos reconhece um movimento enquanto a visualização está em foco, ele chama o listener apropriado.
/**
* 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;
}
}