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:
- Aktifkan inisiasi tulisan tangan
- Mendeklarasikan dukungan tulis tangan
- Mendukung gestur tulis tangan (pilih, hapus, sisipkan, dan sebagainya)
- Memberikan lokasi kursor dan data posisi lainnya ke IME
- 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.](https://developer.android.com/static/images/develop/ui/compose/touch-input/stylus-input/shared/edittext_handwriting_bounds.png?hl=id)
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:
Pilih tidak ikut inisiasi tulis tangan otomatis dalam sistem tampilan dengan memanggil
setAutoHandwritingEnabled(false)
Melacak semua editor teks yang terlihat dalam tampilan.
Memantau kejadian gerakan yang diterima oleh tampilan dalam
dispatchTouchEvent()
Saat gerakan stilus terjadi dalam batas tulisan tangan editor teks, fokuskan editor teks (jika belum difokuskan).
Jika editor belum difokuskan, mulai ulang IME editor dengan konten dengan memanggil
InputMethodManager#restartInput()
Mulai sesi tulis tangan stilus dengan memanggil
InputMethodManager#startStylusHandwriting()
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 apakahMotionEvent
berasal dari stilus, dalam hal ini nilai yang ditampilkan adalahTOOL_TYPE_STYLUS
atauTOOL_TYPE_ERASER
.InputMethodManager#isStylusHandwritingAvailable()
— Menunjukkan apakah IME mendukung tulis tangan stilus. Panggil ini sebelum setiap panggilan keInputMethodManager#startStylusHandwriting()
karena ketersediaan tulisan tangan mungkin telah berubah.InputMethodManager#startStylusHandwriting()
— Menyebabkan IME masuk mode tulis tangan. ChannelACTION_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 menggunakanInputConnection
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.
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. ArgumenHandwritingGesture
berisi informasi lokasi yang dapat Anda gunakan untuk menentukan di mana teks itu akan melakukan {i>gesture <i}tersebut. Misalnya,SelectGesture
menyediakanRectF
yang menentukan rentang teks yang dipilih, danInsertGesture
memberikanPointF
yang menentukan offset teks tempat menyisipkan teks.Gunakan
Executor
dan ParameterIntConsumer
untuk mengirim kembali hasil operasi. Ketika baik eksekutor maupun argumen konsumen diberikan, gunakan eksekutor untuk memanggilIntConsumer#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 (lihatPreviewableHandwritingGesture
).Parameter
CancellationSignal
dapat digunakan oleh IME untuk membatalkan pratinjau. Jika acara lain mengganggu pratinjau (misalnya, teks diubah terjadi perintahInputConnection
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.