Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Compatibilidad de entrada para Chromebooks

Los usuarios de laptops suelen usar dispositivos de entrada diferentes de los de teléfonos.

Cuando se ejecutan en Chromebooks, las apps para Android se encuentran en un entorno para el que no fueron diseñadas y se muestran dentro de una ventana en una laptop con mouse, panel táctil y teclado. Si bien Android tiene compatibilidad con estos dispositivos, rara vez se implementan correctamente en las apps. Con el objetivo de que estas apps funcionen, las Chromebooks usan un modo de compatibilidad que se aplica a todas las apps de forma predeterminada.

Modo de compatibilidad

En el modo de compatibilidad, tu app recibirá eventos de forma diferente a como los proporcionan las API de Android. Este modo es útil para los desarrolladores que no desean implementar funciones específicas de Chromebook, pero quieren que su app táctil funcione.

El modo de compatibilidad presenta los siguientes comportamientos:

  • El desplazamiento del panel táctil puede emular el desplazamiento de la pantalla táctil con 2 "dedos".
  • El desplazamiento de la rueda del mouse puede hacer lo mismo.
  • Todas las mediciones y los eventos se comportan como si la ventana de la app se visualizara en pantalla completa. Es posible que métodos como getRawX y getRawY no muestren coordenadas de pantalla-espacio, pero sí coordenadas de ventana-espacio.

Según el nivel de API objetivo de tu app, el modo de compatibilidad proporcionará más o menos de estos tratamientos de compatibilidad.

Usa android.hardware.type.pc

Si quieres optimizar tu app para que se ejecute en Chromebooks y hacer un buen uso de los dispositivos de entrada, declara lo siguiente en el manifiesto:

<uses-feature
        android:name="android.hardware.type.pc"
        android:required="false" />
    

Este código le indica a Android que orientas tu app a dispositivos de PC, que generalmente se usan con teclado, mouse y panel táctil. Inhabilita el modo de compatibilidad y te permite desarrollar un comportamiento personalizado para el mouse y el panel táctil.

Ten cuidado con DecorCaptionView

En el modo de ventana de formato libre, la barra de subtítulos de las apps forma parte de tu jerarquía de vistas y está bajo tu control. Por lo general, no es necesario que lo tengas en cuenta, pero hay casos, como los siguientes, en los que debes tener cuidado:

  • No uses Window.getDecorView(). Si desea agregar vistas generales, hazlo en la vista que estableció como Activity.setContentView().
  • No esperes que tu Activity.setContentView() esté en el punto (0, 0) de tu app. Ahí está la barra de subtítulos.
  • En lo posible, evita usar MotionEvent.getRawX() o MotionEvent.getRawY(). Si los usas, hazlo junto con View.getLocationOnScreen() para transformar las coordenadas en coordenadas de vista-espacio.

Compatibilidad con dispositivos de entrada

Una vez que orientes tu app a dispositivos de PC mediante el indicador android.hardware.type.pc, puedes esperar los siguientes eventos:

Compatibilidad con mouse y panel táctil

El mouse y el panel táctil generan MotionEvents al igual que los eventos táctiles. Marca MotionEvent.getSource() para distinguir entre SOURCE_MOUSE y SOURCE_TOUCHSCREEN.

  • Movimiento del mouse/panel táctil: Genera eventos ACTION_HOVER_MOVE, que se controlan en View.onGenericMotionEvent().
  • Botones del mouse/panel táctil: Envía eventos ACTION_BUTTON_PRESS y ACTION_BUTTON_RELEASE a View.onGenericMotionEvent(). También puedes verificar si hay botones presionados en todos los eventos del mouse/panel táctil con getButtonState().
  • Desplazamiento del panel táctil: El desplazamiento con dos dedos en el panel táctil se informa de manera similar a los eventos de arrastrar de la pantalla táctil para permitir un desplazamiento fluido y cinético. Usa getSource() si deseas que el arrastre de la pantalla táctil y el desplazamiento del panel táctil se comporten de manera diferente.
  • Desplazamiento de la rueda del mouse: El desplazamiento de la rueda del mouse se registra como eventos ACTION_SCROLL para View.onGenericMotionEvent().
  • Clic y arrastre del mouse o el panel táctil: Los eventos de clic y arrastre son muy similares a los eventos de arrastre con pantalla táctil. Usa getButtonState() para distinguir la acción de hacer clic y arrastrar de un evento de desplazamiento del panel táctil. Hacer clic y arrastrar siempre irá acompañado de un botón, mientras que el desplazamiento del panel táctil no.

Compatibilidad con el botón derecho del mouse

Para administrar eventos de clic con el botón derecho, también conocidos como eventos de clic en el contexto, puedes configurar un elemento View.OnContextClickListener a la vista.

Kotlin

    yourView.setOnContextClickListener {
        //display context click options
        true
    }
    

Java

    yourView.setOnContextClickListener(new View.OnContextClickListener() {
    @Override
      public boolean onContextClick(View view) {
        //display context click options
        return true;
      }
    });
    

Este método se agregó en la API nivel 23, por lo que si deseas permitir la misma funcionalidad en otros dispositivos que podrían estar ejecutando una versión anterior de Android, puedes usar eventos de movimiento genéricos como se muestra más arriba.

Teclado

La entrada del teclado es importante en dispositivos de escritorio y portátiles. También es muy necesaria para la accesibilidad.

Para obtener la activación adecuada del enfoque de entrada, deberías seguir las siguientes adiciones de recursos normales que se describen en la API de Android predeterminada:

  • Si quieres controlar la entrada del teclado, puedes usar las funciones predeterminadas a través de KeyEvent.callback. No es necesario controlar la entrada del teclado dentro de un elemento TextEdit.
  • Si quieres editar el texto, debes usar los eventos onKeyDown, onKeyLongPress y onKeyUp, pero no onKeyPreIME, a menos que desees implementar todo el IME (que no se recomienda).

Pluma stylus

Una pluma stylus informa eventos similares a una pantalla táctil mediante View.onTouchEvent(). Sin embargo, los eventos de la pluma stylus incluyen más información que debes tener en cuenta:

  • MotionEvent.getToolType(): El tipo de herramienta te permite distinguir eventos TOOL_TYPE_FINGER de eventos TOOL_TYPE_STYLUS. También te permite reconocer el uso del lado del borrador de un lápiz, si el usuario tiene uno, mediante TOOL_TYPE_ERASER.
  • MotionEvent.getPressure(): Representa la presión física aplicada a la pluma stylus, si es compatible.
  • MotionEvent.AXIS_TILT/AXIS_ORIENTATION: Se puede usar con MotionEvent.getAxisValue() para leer la inclinación física y la orientación de la pluma stylus, si es compatible.

Puntos históricos

Android procesa eventos de entrada en lotes, que se entregarán una vez por fotograma. Sin embargo, una pluma stylus puede informar a frecuencias mucho más altas (normalmente, 200 Hz). Cuando crees apps de dibujo, es importante que uses los siguientes puntos adquiridos de la API histórica:

  • MotionEvent.getHistoricalX()
  • MotionEvent.getHistoricalY()
  • MotionEvent.getHistoricalPressure()
  • MotionEvent.getHistoricalAxisValue()

Rechazo de la palma

El Sistema operativo Chrome intenta reconocer las palmas en estado de reposo para que nunca se informen a la app. Sin embargo, esto no siempre es posible. A veces, se puede informar un toque antes de que el SO lo reconozca como una palma. En ese caso, se cancelarán los toques informando un evento ACTION_CANCEL.

Este evento le indica a la app que ningún toque es válido y que debes deshacer todas las interacciones causadas por los toques. Por ejemplo, en el caso de las apps de dibujo, la app dibujará líneas nuevas temporalmente y las confirmará en el recuadro una vez que la serie táctil haya finalizado de manera correcta. Si se cancela el toque, esa línea temporal se puede quitar con facilidad.

Intent para tomar notas

El Sistema operativo Chrome muestra una lista de aplicaciones registradas para controlar intents que contienen una acción org.chromium.arc.intent.action.CREATE_NOTE y la categoría Intent.CATEGORY_DEFAULT (es decir, android.intent.category.DEFAULT), como se muestra en el siguiente fragmento de código:

  <intent-filter>
        <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    

El usuario podrá seleccionar una app, y esa app se iniciará más tarde cuando se solicite una app para tomar notas.

Cuando el usuario solicita crear una nueva nota, la app se inicia mediante un intent que contiene solo la acción y la categoría antes mencionadas. La app debería crear una nota vacía en un modo en el que el usuario pueda escribir con una pluma stylus.

Cuando el usuario solicita anotar el contexto de una imagen (p. ej., una captura de pantalla o una imagen descargada), la app se inicia mediante un intent con la acción y la categoría mencionadas anteriormente, y se incluye el elemento ClipData, que contiene uno o más elementos con URI content://. La app debería crear una nota que use la primera imagen adjunta como imagen de fondo en un modo en el que el usuario pueda dibujar con una pluma stylus.

Prueba sin una pluma stylus

  1. Cambia al modo de desarrollo y haz que se pueda escribir en el dispositivo.
  2. Presiona Ctrl + Alt + F2 (flecha hacia adelante) para abrir el shell.
  3. Ejecuta el comando sudo vi /etc/chrome_dev.conf.
  4. Agrega --ash-enable-palette a una línea nueva al final del archivo.
  5. Presiona Ctrl + Alt + F1 (flecha hacia atrás) para volver a la IU.
  6. Sal y vuelve a acceder.

Ahora verás los puntos de entrada de la pluma stylus: - En la biblioteca, puedes presionar el botón de la pluma stylus y seleccionar "Nueva nota". Se debería abrir una nota de dibujo en blanco en tu aplicación. - Si tomas una captura de pantalla (en la biblioteca: botón de la pluma stylus > Captura de pantalla) o descargas una imagen, deberías ver la opción "Escribir en la imagen" en la notificación. Se debería abrir tu app con la imagen lista para ser anotada.

Controles de videojuegos

Las Chromebooks admiten hasta 4 controles de juegos y siguen las API de Android estándar para informarlos. Lamentablemente, es bastante común que los controles de juegos no diseñados para Android muestren una asignación de botones incorrecta.