Editor teks kustom

Editor teks kustom adalah tampilan yang tidak komponen EditText atau widget teks WebView tetapi tetap mendukung input teks dengan menerapkan onCreateInputConnection() , yang dipanggil saat tampilan difokuskan dan sistem meminta callback InputConnection untuk tampilan.

Panggilan ke onCheckIsTextEditor() dari editor teks kustom akan menampilkan true.

Mendukung tulis tangan stilus di editor teks kustom

Android 14 (level API 34) dan yang lebih tinggi mendukung input stilus di Android standar komponen entri teks secara default (lihat Input stilus dalam teks kolom). Namun, kolom entri teks kustom (atau editor) memerlukan pengembangan tambahan.

Untuk membuat editor teks kustom, lakukan hal berikut:

  1. Aktifkan inisiasi tulisan tangan
  2. Mendeklarasikan dukungan tulis tangan
  3. Mendukung gestur tulis tangan (pilih, hapus, sisipkan, dan sebagainya)
  4. Memberikan lokasi kursor dan data posisi lainnya ke IME
  5. Tampilkan ikon arahkan kursor tulis tangan stilus

Aktifkan inisiasi tulisan tangan

Jika tampilan hanya terdiri dari satu editor teks, sistem tampilan dapat memulai tulis tangan stilus untuk tampilan secara otomatis. Jika tidak, tampilan harus menerapkan logika inisiasi tulisan tangannya sendiri.

Inisiasi tulis tangan otomatis

Jika tampilan menampilkan satu editor teks dan tidak ada konten lain, tampilan dapat memilih ke dalam inisiasi tulisan tangan otomatis sistem tampilan dengan memanggil setAutoHandwritingEnabled(true)

Dengan mengaktifkan tulisan tangan otomatis, gerakan stilus dimulai dari mana saja dalam tampilan batas tulisan tangan akan otomatis memulai mode tulis tangan. Metode input yang diterima oleh editor (IME) peristiwa gerakan stilus dan meng-commit teks yang dikenali.

Kolom input dengan persegi panjang di sekitarnya yang menunjukkan batas untuk deteksi peristiwa gerakan stilus.
Gambar 1. Tulis tangan dalam batas kolom EditText.

Inisiasi tulisan tangan kustom

Jika tampilan berisi beberapa editor teks atau konten selain satu teks editor, tampilan harus menerapkan logika inisiasi tulisan tangannya sendiri sebagai berikut:

  1. Pilih tidak ikut inisiasi tulis tangan otomatis dalam sistem tampilan dengan memanggil setAutoHandwritingEnabled(false)

  2. Melacak semua editor teks yang terlihat dalam tampilan.

  3. Memantau kejadian gerakan yang diterima oleh tampilan dalam dispatchTouchEvent()

Jika editor teks berada dalam tampilan yang dapat di-scroll, gerakan stilus di dalam batas tulisan tangan pada editor harus dianggap sebagai tulisan tangan, bukan menggulir. Gunakan ViewParent#requestDisallowInterceptTouchEvent() untuk mencegah tampilan ancestor yang dapat di-scroll menangkap peristiwa sentuh dari teks .

Detail API

  • MotionEvent#getToolType() — Menunjukkan apakah MotionEvent berasal dari stilus, dalam hal ini nilai yang ditampilkan adalah TOOL_TYPE_STYLUS atau TOOL_TYPE_ERASER.

  • InputMethodManager#isStylusHandwritingAvailable() — Menunjukkan apakah IME mendukung tulis tangan stilus. Panggil ini sebelum setiap panggilan ke InputMethodManager#startStylusHandwriting() karena ketersediaan tulisan tangan mungkin telah berubah.

  • InputMethodManager#startStylusHandwriting() — Menyebabkan IME masuk mode tulis tangan. Channel ACTION_CANCEL kejadian gerakan dikirimkan ke aplikasi untuk membatalkan {i>gesture <i}saat ini. Stilus tidak lagi dikirimkan ke aplikasi.

    Peristiwa gerakan stilus dari gestur saat ini yang sudah dikirimkan ke aplikasi diteruskan ke IME. IME diperlukan untuk menampilkan tinta stilus jendela tempat IME menerima semua objek MotionEvent berikut. IME melakukan commit teks tulisan tangan yang dikenali menggunakan InputConnection Google Cloud Platform.

    Jika IME tidak dapat masuk ke mode tulis tangan, berarti panggilan metode ini tidak dioperasikan.

Mendeklarasikan dukungan tulis tangan

Saat mengisi Argumen EditorInfo pengguna Panggilan View#onCreateInputConnection(EditorInfo) setStylusHandwritingEnabled() untuk memberi tahu IME bahwa editor teks mendukung tulisan tangan. Deklarasikan gestur yang didukung dengan setSupportedHandwritingGestures() dan setSupportedHandwritingGesturePreviews().

Mendukung gestur tulis tangan

IME dapat mendukung berbagai gestur tulis tangan, seperti melingkari teks untuk memilih atau mencoret-coret teks untuk menghapusnya.

Gambar 2. Lingkari untuk memilih teks.
Gambar 3. Coret untuk menghapus teks.

Editor kustom menerapkan InputConnection#performHandwritingGesture() dan InputConnection#previewHandwritingGesture() untuk mendukung berbagai HandwritingGesture jenis, seperti SelectGesture, DeleteGesture, dan InsertGesture.

Mendeklarasikan gestur tulis tangan yang didukung saat mengisi argumen EditorInfo dari View#onCreateInputConnection(EditorInfo) (lihat dokumentasi Menyatakan tulisan tangan dukungan).

Detail API

  • InputConnection#performHandwritingGesture(HandwritingGesture, Executor, IntConsumer) — Mengimplementasikan gerakan. Argumen HandwritingGesture berisi informasi lokasi yang dapat Anda gunakan untuk menentukan di mana teks itu akan melakukan {i>gesture <i}tersebut. Misalnya, SelectGesture menyediakan RectF yang menentukan rentang teks yang dipilih, dan InsertGesture memberikan PointF yang menentukan offset teks tempat menyisipkan teks.

    Gunakan Executor dan Parameter IntConsumer untuk mengirim kembali hasil operasi. Ketika baik eksekutor maupun argumen konsumen diberikan, gunakan eksekutor untuk memanggil IntConsumer#accept(), misalnya:

    
    executor.execute { consumer.accept(HANDWRITING_GESTURE_RESULT_SUCCESS) }
    
  • HandwritingGesture#getFallbackText() — Menyediakan teks pengganti yang di-commit IME di posisi kursor jika tidak teks yang dapat diterapkan berada di bawah area gestur tulis tangan.

    Terkadang IME tidak dapat menentukan apakah gestur stilus yang dimaksudkan untuk melakukan operasi {i>gesture <i}atau untuk menulis teks tulisan tangan. Teks kustom bertanggung jawab untuk menentukan niat pengguna dan melakukan tindakan yang sesuai (bergantung pada konteks) di lokasi gestur.

    Contohnya, jika IME tidak bisa memastikan apakah pengguna bermaksud menggambar tanda sisipan ke bawah ⋁ untuk melakukan gestur menyisipkan spasi atau menulis tangan huruf "v," IME dapat mengirim InsertGesture dengan teks pengganti "v".

    Editor harus terlebih dahulu mencoba melakukan gestur sisipkan spasi. Jika gestur tidak dapat dilakukan (misalnya, tidak ada teks di lokasi yang ditentukan), editor harus kembali untuk menyisipkan "{i>v<i}" di posisi kursor posisi Anda.

  • InputConnection#previewHandwritingGesture(PreviewableHandwritingGesture, CancellationSignal) — Melihat pratinjau gestur yang sedang berlangsung. Misalnya, saat pengguna mulai menggambar lingkaran di sekitar teks, pratinjau langsung dari pilihan yang dihasilkan dapat ditampilkan dan terus diperbarui selama pengguna melanjutkan menggambar. Hanya tertentu jenis gestur dapat dipratinjau (lihat PreviewableHandwritingGesture).

    Parameter CancellationSignal dapat digunakan oleh IME untuk membatalkan pratinjau. Jika acara lain mengganggu pratinjau (misalnya, teks diubah terjadi perintah InputConnection baru atau terprogram), editor kustom dapat membatalkan pratinjau.

    Gestur pratinjau hanya untuk tampilan dan tidak boleh mengubah status. Misalnya, pratinjau SelectGesture menyembunyikan rentang pilihan dan menandai rentang pratinjau gestur. Tapi setelah pratinjau dibatalkan, editor akan memulihkan rentang pilihan sebelumnya.

Memberikan data lokasi kursor dan posisi lainnya

Dalam mode tulis tangan, IME dapat meminta lokasi kursor dan data posisi lainnya menggunakan InputConnection#requestCursorUpdates() Editor kustom merespons dengan panggilan ke InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo) Data di CursorAnchorInfo yang relevan dengan tulis tangan stilus disediakan dalam dokumentasi CursorAnchorInfo.Builder metode:

  • setInsertionMarkerLocation() — Menetapkan lokasi kursor. IME menggunakan nilai ini untuk menganimasikan tulis tangan ke lokasi kursor.
  • setEditorBoundsInfo() — Menetapkan batas editor dan batas tulisan tangan. IME menggunakan data ini untuk memosisikan toolbar tulis tangan IME di layar.
  • addVisibleLineBounds() — Menetapkan batas semua baris teks yang terlihat (atau yang terlihat sebagian) editor. IME menggunakan batas garis untuk meningkatkan akurasi dalam mengenali gestur tulis tangan.
  • setTextAppearanceInfo() — Mengatur tampilan teks dengan informasi yang berasal dari teks bidang input. IME menggunakan informasi tersebut untuk menata gaya tinta tulisan tangan.

Tampilkan ikon arahkan kursor tulis tangan stilus

Tampilkan ikon arahkan kursor tulis tangan stilus saat stilus diarahkan ke batas tulisan tangan editor teks kustom Anda dan IME yang dipilih mendukung tulis tangan stilus (InputMethodManager#isStylusHandwritingAvailable())

Ganti View#onResolvePointerIcon() guna mendapatkan ikon arahkan kursor untuk tulis tangan stilus. Di penggantian, panggil PointerIcon.getSystemIcon(context, PointerIcon.TYPE_HANDWRITING) untuk mengakses ikon arahkan kursor tulis tangan stilus sistem.

Referensi lainnya