Editor di testo personalizzati

Gli editor di testo personalizzati sono viste che non sono EditText componenti o WebView widget di testo ma supporta comunque l'input di testo implementando onCreateInputConnection() , che viene chiamato quando una vista viene selezionata e il sistema richiede InputConnection per la vista.

Una chiamata a onCheckIsTextEditor() da un editor di testo personalizzato dovrebbe restituire true.

Supporta la scrittura a mano libera con stilo negli editor di testo personalizzati

Android 14 (livello API 34) e versioni successive supportano l'inserimento dello stilo in Android standard componenti di inserimento di testo per impostazione predefinita (vedi Input di input dello stilo nel testo campi). Tuttavia, i campi di immissione di testo personalizzati (o editor) richiedono ulteriori sviluppi.

Per creare un editor di testo personalizzato:

  1. Attiva avvio scrittura a mano libera
  2. Dichiara il supporto della scrittura a mano libera
  3. Supporta i gesti per la scrittura a mano libera (selezione, eliminazione, inserimento e così via)
  4. Fornisce la posizione del cursore e altri dati sulla posizione all'IME
  5. Mostra l'icona al passaggio del mouse per la scrittura a mano libera con lo stilo

Attiva avvio scrittura a mano libera

Se una visualizzazione consiste in un unico editor di testo, il sistema di visualizzazione può avvia automaticamente la scrittura a mano libera con lo stilo per la vista. In caso contrario, la vista deve a implementare la propria logica di avvio della scrittura a mano libera.

Avvio automatico della scrittura a mano libera

Se una visualizzazione mostra un solo editor di testo e nessun altro contenuto, la visualizzazione può attivare l'avvio automatico della scrittura a mano libera del sistema di visualizzazione setAutoHandwritingEnabled(true)

Con la scrittura a mano libera automatica attivata, il movimento dello stilo inizia da qualsiasi punto all'interno della visualizzazione i limiti di scrittura a mano libera avviano automaticamente la modalità di scrittura a mano libera. Il metodo di inserimento dell'editor (IME) riceve gli eventi di movimento dello stilo ed esegue il commit del testo riconosciuto.

Campo di immissione circondato da un rettangolo che indica i limiti per il rilevamento degli eventi di movimento dello stilo.
. Figura 1. Scrittura a mano libera entro i limiti di un campo EditText.

Avvio della scrittura a mano libera personalizzata

Se una visualizzazione include più editor di testo o contenuti oltre a un unico testo l'editor, la vista deve implementare la propria logica di avvio della scrittura a mano libera, come descritto di seguito:

  1. Disattiva l'avvio automatico della scrittura a mano libera del sistema di visualizzazione chiamando setAutoHandwritingEnabled(false)

  2. Tieni traccia di tutti gli editor di testo visibili nella visualizzazione.

  3. Monitora gli eventi di movimento ricevuti dalla vista in dispatchTouchEvent()

    • Quando il movimento dello stilo si verifica entro i limiti di scrittura a mano libera di un editor di testo, Imposta lo stato attivo sull'editor di testo (se non è già attivo).

    • Se l'editor non era già selezionato, riavvia l'IME dell'editor con una nuova richiamando InputMethodManager#restartInput()

    • Avvia la sessione di scrittura a mano libera con stilo chiamando InputMethodManager#startStylusHandwriting()

di Gemini Advanced.

Se un editor di testo si trova all'interno di una visualizzazione scorrevole, il movimento dello stilo all'interno della i limiti di scrittura a mano libera dell'editor devono essere considerati scrittura a mano libera, non scorrimento. Utilizza le funzionalità di ViewParent#requestDisallowInterceptTouchEvent() per impedire a una visualizzazione predecessore scorrevole di intercettare gli eventi di tocco da un testo editor.

Dettagli API

  • MotionEvent#getToolType() - Indica se MotionEvent proviene da uno stilo, nel qual caso il valore restituito è TOOL_TYPE_STYLUS o TOOL_TYPE_ERASER.

  • InputMethodManager#isStylusHandwritingAvailable() - Indica se l'IME supporta la scrittura a mano libera con lo stilo. Chiama prima di ogni chiamata a InputMethodManager#startStylusHandwriting() poiché la disponibilità della scrittura a mano libera potrebbe essere cambiata.

  • InputMethodManager#startStylusHandwriting() - L'IME viene attivato in modalità di scrittura a mano libera. Un ACTION_CANCEL l'evento di movimento viene inviato all'app per annullare il gesto corrente. Stilo gli eventi di movimento non vengono più inviati all'app.

    Eventi di movimento dello stilo del gesto corrente che sono già stati inviati l'app viene inoltrata all'IME. L'IME è necessario per mostrare l'inchiostro dello stilo finestra attraverso la quale l'IME riceve tutti i seguenti oggetti MotionEvent. L'IME esegue il commit del testo scritto a mano libera riconosciuto utilizzando il metodo InputConnection su quelle di livello inferiore.

    Se l'IME non può attivare la modalità di scrittura a mano libera, la chiamata al metodo è automatica.

Dichiara il supporto della scrittura a mano libera

Quando compili il EditorInfo argomento di View#onCreateInputConnection(EditorInfo) chiamata setStylusHandwritingEnabled() per comunicare all'IME che l'editor di testo supporta la scrittura a mano libera. Dichiara i gesti supportati con setSupportedHandwritingGestures() e setSupportedHandwritingGesturePreviews().

Supporta i gesti per la scrittura a mano libera

Gli IME possono supportare diversi gesti di scrittura a mano libera, ad esempio cerchiare il testo per selezionarlo oppure di scarabocchiare sopra del testo per eliminarlo.

di Gemini Advanced.
Figura 2. Cerchia e seleziona il testo.
di Gemini Advanced.
.
. di Gemini Advanced.
Figura 3. Disegna per eliminare il testo.

Gli editor personalizzati implementano InputConnection#performHandwritingGesture() e InputConnection#previewHandwritingGesture() per supportare diversi HandwritingGesture di tipi, come SelectGesture, DeleteGesture e InsertGesture.

Dichiara i gesti di scrittura a mano libera supportati durante l'inserimento dell'argomento EditorInfo di View#onCreateInputConnection(EditorInfo) (consulta la sezione Dichiarazione della scrittura a mano libera assistenza).

Dettagli API

  • InputConnection#performHandwritingGesture(HandwritingGesture, Executor, IntConsumer) — Implementa i gesti. L'argomento HandwritingGesture contiene informazioni sulla posizione che puoi utilizzare per determinare il punto nel testo esegui il gesto. Ad esempio, SelectGesture fornisce una RectF che specifica l'intervallo di testo selezionato e InsertGesture fornisce una PointF oggetto specifica l'offset di testo in cui inserire il testo.

    Utilizza i Executor e Parametri IntConsumer per inviare il risultato dell'operazione. Quando sia l'esecutore che gli argomenti del consumatore, usa l'esecutore per chiamare IntConsumer#accept(), Ad esempio:

    
    executor.execute { consumer.accept(HANDWRITING_GESTURE_RESULT_SUCCESS) }
    
    
  • HandwritingGesture#getFallbackText() — Fornisce il testo di riserva di cui l'IME esegue il commit nella posizione del cursore, se non esistono il testo applicabile si trova sotto l'area del gesto di scrittura a mano libera.

    A volte l'IME non è in grado di determinare se il gesto dello stilo è destinato a eseguire un'operazione tramite gesti o a scrivere testo a mano libera. Un testo personalizzato dell'utente è responsabile di determinare l'intenzione dell'utente e di L'azione appropriata (a seconda del contesto) nella posizione del gesto.

    Ad esempio, se l'IME non è in grado di determinare se l'utente intendesse disegnare un cursore verso il basso ⋁ per eseguire il gesto di inserimento di uno spazio o per scrivere a mano libera la lettera "v" l'IME può inviare un InsertGesture con il testo di riserva "v".

    L'editor dovrebbe prima provare a eseguire il gesto di inserimento dello spazio. Se impossibile eseguire il gesto (ad esempio, non c'è testo nella posizione specificato), l'editor deve inserire "v" in corrispondenza del cursore posizione.

  • InputConnection#previewHandwritingGesture(PreviewableHandwritingGesture, CancellationSignal) — Visualizza l'anteprima di un gesto in corso. Ad esempio, quando l'utente inizia a disegnare un cerchio intorno al testo, puoi visualizzare un'anteprima in tempo reale della selezione vengono visualizzati e aggiornati continuamente man mano che l'utente continua a disegnare. Solo alcuni i tipi di gesti sono visualizzabili in anteprima (vedi PreviewableHandwritingGesture).

    Il parametro CancellationSignal può essere utilizzato dall'IME per annullare il l'anteprima. Se altri eventi interrompono l'anteprima (ad esempio, il testo viene modificato in modo programmatico o nuovi comandi InputConnection), l'editor personalizzato può annullare l'anteprima.

    I gesti di anteprima sono solo a scopo di visualizzazione e non devono modificare l'impostazione stato. Ad esempio, un'anteprima di SelectGesture nasconde lo stato attuale dell'editor intervallo di selezione ed evidenzia l'intervallo di anteprima del gesto. Ma una volta l'anteprima viene annullata, l'editor dovrebbe ripristinare l'intervallo di selezione precedente.

Fornisci la posizione del cursore e altri dati sulla posizione

Nella modalità di scrittura a mano libera, l'IME può richiedere la posizione del cursore e altri dati sulla posizione utilizzando InputConnection#requestCursorUpdates() L'editor personalizzato risponde con una chiamata a InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo) I dati presenti in CursorAnchorInfo pertinenti per la scrittura a mano libera con lo stilo viene fornita tramite: CursorAnchorInfo.Builder metodo:

  • setInsertionMarkerLocation() - Imposta la posizione del cursore. L'IME utilizza il valore per animare scrittura a mano libera nella posizione del cursore.
  • setEditorBoundsInfo() : imposta i limiti dell'editor e della scrittura a mano libera. L'IME utilizza questi dati per posizionare la barra degli strumenti per la scrittura a mano libera dell'IME sullo schermo.
  • addVisibleLineBounds() — Imposta i limiti di tutte le righe di testo visibili (o parzialmente visibili) all'editore. L'IME utilizza i limiti di riga per migliorare l'accuratezza nel riconoscimento gesti di scrittura a mano libera.
  • setTextAppearanceInfo() — Imposta l'aspetto del testo con informazioni derivate dal testo campo di immissione. L'IME utilizza le informazioni per definire lo stile dell'inchiostro per la scrittura a mano libera.

Mostra l'icona al passaggio del mouse per la scrittura a mano libera con lo stilo

Mostra l'icona del passaggio del mouse della scrittura a mano libera con lo stilo quando quest'ultimo ci passa sopra limiti di scrittura a mano libera dell'editor di testo personalizzato e l'IME selezionato supporta scrittura a mano libera con stilo (InputMethodManager#isStylusHandwritingAvailable()).

Esegui override View#onResolvePointerIcon() per visualizzare un'icona al passaggio del mouse per la scrittura a mano libera con stilo. Nell'override, chiama PointerIcon.getSystemIcon(context, PointerIcon.TYPE_HANDWRITING) per accedere all'icona del sistema visualizzata a mano libera con lo stilo.

Risorse aggiuntive