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:
- Attiva avvio scrittura a mano libera
- Dichiara il supporto della scrittura a mano libera
- Supporta i gesti per la scrittura a mano libera (selezione, eliminazione, inserimento e così via)
- Fornisce la posizione del cursore e altri dati sulla posizione all'IME
- 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.
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:
Disattiva l'avvio automatico della scrittura a mano libera del sistema di visualizzazione chiamando
setAutoHandwritingEnabled(false)
Tieni traccia di tutti gli editor di testo visibili nella visualizzazione.
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()
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 seMotionEvent
proviene da uno stilo, nel qual caso il valore restituito èTOOL_TYPE_STYLUS
oTOOL_TYPE_ERASER
.InputMethodManager#isStylusHandwritingAvailable()
- Indica se l'IME supporta la scrittura a mano libera con lo stilo. Chiama prima di ogni chiamata aInputMethodManager#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. UnACTION_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 metodoInputConnection
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.
.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'argomentoHandwritingGesture
contiene informazioni sulla posizione che puoi utilizzare per determinare il punto nel testo esegui il gesto. Ad esempio,SelectGesture
fornisce unaRectF
che specifica l'intervallo di testo selezionato eInsertGesture
fornisce unaPointF
oggetto specifica l'offset di testo in cui inserire il testo.Utilizza i
Executor
e ParametriIntConsumer
per inviare il risultato dell'operazione. Quando sia l'esecutore che gli argomenti del consumatore, usa l'esecutore per chiamareIntConsumer#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 (vediPreviewableHandwritingGesture
).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 comandiInputConnection
), 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.