Niestandardowe edytory tekstu to widoki, które nie są
EditText
lub
WebView
widżetów tekstowych, ale
obsługują jednak wprowadzanie tekstu przez implementację
onCreateInputConnection()
wywołania zwrotnego, które jest wywoływane, gdy widok jest zaznaczony, a system wysyła żądanie
InputConnection
dla danego widoku.
Wywołanie:
onCheckIsTextEditor()
z niestandardowego edytora tekstu, powinna zwrócić wartość true
.
Obsługa pisma odręcznego rysikiem w niestandardowych edytorach tekstu
Android 14 (poziom interfejsu API 34) i nowsze obsługują wprowadzanie rysikiem w standardowym Androidzie domyślne komponenty do wpisywania tekstu (patrz Wprowadzanie rysikiem w tekście) ). Niestandardowe pola do wprowadzania tekstu (lub edytory) wymagają jednak dodatkowych działań.
Aby utworzyć niestandardowy edytor tekstu:
- Włącz inicjowanie pisma odręcznego
- Deklarowanie obsługi pisma odręcznego
- Obsługa gestów pisma odręcznego (zaznaczanie, usuwanie, wstawianie itd.)
- Podaj lokalizację kursora i inne dane o pozycji w edytorze IME
- Pokazuj ikonę pisma odręcznego rysikiem
Włącz inicjowanie pisma odręcznego
Jeśli widok danych składa się wyłącznie z jednego edytora tekstu, automatyczne inicjowanie pisma odręcznego rysikiem dla danego widoku. W przeciwnym razie widok musi ma własny mechanizm inicjowania pisma odręcznego.
automatyczne inicjowanie pisma odręcznego,
Jeśli w widoku jest tylko jeden edytor tekstu, a nie ma innych treści,
w automatyczne zainicjowanie pisma odręcznego w systemie widoku
setAutoHandwritingEnabled(true)
Po włączeniu automatycznego pisma odręcznego ruch rysikiem zaczyna się w dowolnym miejscu tryb pisma odręcznego jest inicjowany automatycznie. Metoda wprowadzania edytor (IME) odbiera zdarzenia ruchu rysika i zatwierdzanie rozpoznanego tekstu.
![Pole do wprowadzania danych z otaczającym je prostokątem, które wskazuje granice wykrywania zdarzeń ruchu rysika.](https://developer.android.com/static/images/develop/ui/compose/touch-input/stylus-input/shared/edittext_handwriting_bounds.png?authuser=9&hl=pl)
EditText
.
Inicjowanie niestandardowego pisma odręcznego
Jeśli widok zawiera oprócz jednego tekstu wiele edytorów tekstu lub treści widoku, widok musi mieć własną logikę inicjowania pisma odręcznego w następujący sposób:
Zrezygnuj z automatycznego inicjowania pisma odręcznego w systemie wyświetlania, dzwoniąc pod numer
setAutoHandwritingEnabled(false)
Śledź wszystkie edytory tekstu, które są widoczne w widoku.
Monitoruj zdarzenia ruchu odbierane przez widok w
dispatchTouchEvent()
Gdy ruch rysikiem znajdzie się w granicach pisma odręcznego edytora tekstu, zaznacz edytor tekstu (jeśli nie jest jeszcze zaznaczony).
Jeśli edytor nie był wcześniej zaznaczony, uruchom ponownie edytor IME nowego edytora treści, używając funkcji
InputMethodManager#restartInput()
Rozpocznij sesję pisma odręcznego rysikiem, dzwoniąc
InputMethodManager#startStylusHandwriting()
Jeśli edytor tekstu znajduje się w widoku przewijanym, ruch rysikiem
Granice pismo odręcznego redaktora należy traktować jak pismo odręczne, a nie przewijanie. Używaj
ViewParent#requestDisallowInterceptTouchEvent()
aby zapobiec przechwytywaniu zdarzeń dotknięcia z tekstu przez przewijany widok elementów nadrzędnych
redaktorem.
Szczegóły interfejsu API
MotionEvent#getToolType()
. – wskazuje, czyMotionEvent
pochodzi z rysika. W takim przypadku zwracana wartość jestTOOL_TYPE_STYLUS
lubTOOL_TYPE_ERASER
.InputMethodManager#isStylusHandwritingAvailable()
. – wskazuje, czy edytor IME obsługuje pismo odręczne rysikiem. Zadzwoń przed każdym wywołaniem funkcjiInputMethodManager#startStylusHandwriting()
bo dostępność pisma odręcznego mogła się zmienić.InputMethodManager#startStylusHandwriting()
. – przełącza edytor IME w tryb pisma odręcznego. AnACTION_CANCEL
zdarzenie ruchu jest wysyłane do aplikacji w celu anulowania bieżącego gestu. Rysik zdarzenia ruchu nie są już wysyłane do aplikacji.Zdarzenia ruchu rysikiem w bieżącym gestie, które zostały już wysłane aplikacja jest przekierowywana do IME. Do wyświetlania atramentu rysika jest wymagany edytor IME okno, przez które IME odbiera wszystkie kolejne obiekty
MotionEvent
. Edytor IME zatwierdza rozpoznawany tekst pismem odręcznym za pomocąInputConnection
API.Jeśli edytor IME nie może przejść w tryb pisma odręcznego, ta metoda jest w trybie no-op.
Deklarowanie obsługi pisma odręcznego
Podczas wypełniania
EditorInfo
argument
z
View#onCreateInputConnection(EditorInfo)
połączenie
setStylusHandwritingEnabled()
, aby poinformować IME, że edytor tekstu obsługuje pismo odręczne.
Deklaruj obsługiwane gesty w:
setSupportedHandwritingGestures()
oraz
setSupportedHandwritingGesturePreviews()
Obsługa gestów pisma odręcznego
Edytory IME obsługują różne gesty pisma odręcznego, np. zakreślanie tekstu w celu zaznaczenia lub rysować po tekście, aby go usunąć.
Implementacja edytorów niestandardowych
InputConnection#performHandwritingGesture()
oraz
InputConnection#previewHandwritingGesture()
obsługują różne
HandwritingGesture
typy reklam, takie jak
SelectGesture
DeleteGesture
i
InsertGesture
.
Zadeklaruj obsługiwane gesty pisma odręcznego podczas wypełniania argumentu EditorInfo
z View#onCreateInputConnection(EditorInfo)
(zobacz Deklaruj pismo odręczne
pomocy).
Szczegóły interfejsu API
InputConnection#performHandwritingGesture(HandwritingGesture, Executor, IntConsumer)
. – Implementuje gesty. ArgumentHandwritingGesture
zawiera dzięki którym można określić, gdzie w tekście wykonać gest. Na przykładSelectGesture
udostępniaRectF
obiekt, który określa wybrany zakres tekstu, aInsertGesture
udostępniaPointF
obiekt, który określa przesunięcie tekstu, od którego ma zostać wstawiony tekst.Zapoznaj się z dokumentami
Executor
orazIntConsumer
parametry aby zwrócić wynik operacji. Gdy zarówno wykonawca, jak i dostępnych argumentów konsumenta, użyj wykonawcy, aby wywołaćIntConsumer#accept()
np.:executor.execute { consumer.accept(HANDWRITING_GESTURE_RESULT_SUCCESS) }
HandwritingGesture#getFallbackText()
. – Wyświetla tekst zastępczy zatwierdzony IME w pozycji kursora, jeśli nie odpowiedni tekst znajduje się poniżej obszaru gestu pisma odręcznego.Czasami edytor IME nie jest w stanie określić, czy gest rysikiem przeznaczonego do działania za pomocą gestów lub do pisma odręcznego. Własny tekst odpowiada za określenie zamiarów użytkownika oraz odpowiednie działanie (w zależności od kontekstu) w lokalizacji gestu.
Na przykład: jeśli IME nie jest w stanie określić, czy użytkownik chciał narysować kursor w dół ⋁ pozwala wykonać gest wstawiania spacji lub do pisma odręcznego litera „v”, IME może wysłać
InsertGesture
z tekstem zastępczym „v”.Edytor powinien najpierw spróbować wykonać gest wstawiania spacji. Jeśli nie można wykonać gestu (np. brak tekstu w lokalizacji) ), edytor powinien wrócić do wstawiania litery „v” w miejscu wskazywanym przez kursor pozycji.
InputConnection#previewHandwritingGesture(PreviewableHandwritingGesture, CancellationSignal)
. – wyświetla podgląd trwającego gestu. Na przykład gdy użytkownik zaczyna rysować wokół tekstu, można wyświetlić podgląd na żywo aktualnie zaznaczonego tekstu. i ciągle są aktualizowane w miarę jak użytkownik rysuje dalej. Tylko niektóre można podglądać typy gestów (zobaczPreviewableHandwritingGesture
).Parametr
CancellationSignal
może być używany przez IME do anulowania podgląd. Jeśli inne zdarzenia zakłócają podgląd (np. zmieni się tekst automatycznego lub nowych poleceńInputConnection
), edytor niestandardowy może anulować podgląd.Gesty podglądu są przeznaczone tylko do wyświetlania i nie powinny zmieniać stanu. Na przykład podgląd
SelectGesture
ukrywa bieżące okno edytora zakresu zaznaczenia i podświetlony zakres podglądu gestami. Gdy jednak podgląd został anulowany, edytor powinien przywrócić poprzedni zakres zaznaczenia.
Podaj lokalizację kursora i inne dane o pozycji
W trybie pisma odręcznego edytor IME może zażądać informacji o lokalizacji kursora i innych danych o pozycji
za pomocą
InputConnection#requestCursorUpdates()
Edytor niestandardowy odpowiada, wysyłając wywołanie do
InputMethodManager#updateCursorAnchorInfo(View,
CursorAnchorInfo)
Dane w tabeli
CursorAnchorInfo
dotyczące pisma odręcznego rysikiem
CursorAnchorInfo.Builder
metody:
setInsertionMarkerLocation()
. – ustawia lokalizację kursora. IME używa wartości do animacji pismo odręczne w miejscu kursora.setEditorBoundsInfo()
. – wyznacza granice edytora i pisma odręcznego. IME używa użyć tych danych, by umieścić pasek narzędzi pisma odręcznego IME na ekranie.addVisibleLineBounds()
. – Określa granice wszystkich widocznych (lub częściowo widocznych) wierszy tekstu do redaktora. IME wykorzystuje granice linii, aby zwiększyć dokładność rozpoznawania gestami pisma odręcznego.setTextAppearanceInfo()
. – Ustawia wygląd tekstu na podstawie informacji uzyskanych z tekstu. pola do wprowadzania danych. Na podstawie tych informacji edytor IME określa styl atramentu do pisma odręcznego.
Pokazuj ikonę pisma odręcznego rysikiem
Wyświetlaj ikonę pisma odręcznego rysikiem po najechaniu kursorem na
granic pisma odręcznego w niestandardowym edytorze tekstu oraz wybranym edytorze IME
pismo odręczne rysikiem
(InputMethodManager#isStylusHandwritingAvailable()
).
Zastąp
View#onResolvePointerIcon()
aby zobaczyć ikonę najeżdżania kursorem na pismo odręczne rysikiem. W zastąpieniu użyj wywołania
PointerIcon.getSystemIcon(context, PointerIcon.TYPE_HANDWRITING)
aby uzyskać dostęp do systemowej ikony pisma odręcznego rysika.