Niestandardowe edytory tekstu

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:

  1. Włącz inicjowanie pisma odręcznego
  2. Deklarowanie obsługi pisma odręcznego
  3. Obsługa gestów pisma odręcznego (zaznaczanie, usuwanie, wstawianie itd.)
  4. Podaj lokalizację kursora i inne dane o pozycji w edytorze IME
  5. 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.
Rysunek 1. Pismo odręczne w granicach pola 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:

  1. Zrezygnuj z automatycznego inicjowania pisma odręcznego w systemie wyświetlania, dzwoniąc pod numer setAutoHandwritingEnabled(false)

  2. Śledź wszystkie edytory tekstu, które są widoczne w widoku.

  3. 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, czy MotionEvent pochodzi z rysika. W takim przypadku zwracana wartość jest TOOL_TYPE_STYLUS lub TOOL_TYPE_ERASER.

  • InputMethodManager#isStylusHandwritingAvailable(). – wskazuje, czy edytor IME obsługuje pismo odręczne rysikiem. Zadzwoń przed każdym wywołaniem funkcji InputMethodManager#startStylusHandwriting() bo dostępność pisma odręcznego mogła się zmienić.

  • InputMethodManager#startStylusHandwriting(). – przełącza edytor IME w tryb pisma odręcznego. An ACTION_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ąć.

.
Rysunek 2. Zakreśl, aby zaznaczyć tekst.
.
.
.
Rysunek 3. Zamaż, aby usunąć tekst.

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. Argument HandwritingGesture zawiera dzięki którym można określić, gdzie w tekście wykonać gest. Na przykład SelectGesture udostępnia RectF obiekt, który określa wybrany zakres tekstu, a InsertGesture udostępnia PointF obiekt, który określa przesunięcie tekstu, od którego ma zostać wstawiony tekst.

    Zapoznaj się z dokumentami Executor oraz IntConsumer 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 (zobacz PreviewableHandwritingGesture).

    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.

Dodatkowe materiały