כלים לעריכת טקסט בהתאמה אישית

כלי לעריכת טקסט בהתאמה אישית הם תצוגות שאינן EditText רכיבים או WebView ווידג'טים של טקסט למרות זאת תומכות בקלט טקסט באמצעות onCreateInputConnection() קריאה חוזרת (callback), שנשלחת כשמתמקדים בתצוגה והמערכת מבקשת InputConnection לצפייה.

קריאה אל onCheckIsTextEditor() מעורך טקסט בהתאמה אישית אמור להחזיר true.

תמיכה בכתיבה ידנית בסטיילוס בעורכי טקסט בהתאמה אישית

Android 14 (רמת API 34) ואילך עם תמיכה בקלט סטיילוס ב-Android רגיל רכיבי הזנת טקסט כברירת מחדל (למידע נוסף, ניתן לעיין במאמר קלט סטיילוס בטקסט ). עם זאת, שדות מותאמים אישית להזנת טקסט (או עורכים) מחייבים פיתוח נוסף.

כדי ליצור כלי לעריכת טקסט בהתאמה אישית, מבצעים את הפעולות הבאות:

  1. הפעלת התחלת כתב יד
  2. הצהרה על תמיכה בכתיבה ידנית
  3. תמיכה בתנועות לכתיבה ידנית (בחירה, מחיקה, הוספה וכו')
  4. ספק את מיקום הסמן ונתוני מיקום אחרים ל-IME
  5. הצגת הסמל של העברת העכבר מעל לכתיבה ידנית בסטיילוס

הפעלת התחלת כתב יד

אם תצוגה מורכבת מכלי אחד בלבד לעריכת טקסט, מערכת התצוגה יכולה להפעיל אוטומטית כתב יד בסטיילוס בתצוגה. אחרת, התצוגה חייבת להטמיע לוגיקה משלו להפעלת כתב יד.

הפעלה אוטומטית של כתב יד

אם בתצוגה מוצג כלי לעריכת טקסט יחיד ולא תוכן אחר, התצוגה יכולה להפעלה האוטומטית של כתב היד במערכת של התצוגה, על ידי התקשרות setAutoHandwritingEnabled(true)

כשכתב יד אוטומטי מופעל, תנועת הסטיילוס מתחילה במקום כלשהו בתצוגה גבולות לכתיבה ידנית מפעיל באופן אוטומטי את מצב כתב היד. שיטת הקלט עורך (IME) מקבל אירועי תנועת הסטיילוס ושומר את הטקסט המזוהה.

שדה להזנת קלט עם מלבן מסביבו מציין את הגבולות לזיהוי אירועים של תנועת סטיילוס.
איור 1. כתב יד בגבולות של שדה EditText.

הפעלה של כתב יד בהתאמה אישית

אם תצוגה כוללת כמה כלי עריכה של טקסט או תוכן, בנוסף לטקסט יחיד על התצוגה ליישם לוגיקה משלו של התחלת כתב יד:

  1. ביטול ההסכמה להפעלה אוטומטית של כתב יד במערכת התצוגה באמצעות שיחה setAutoHandwritingEnabled(false)

  2. מעקב אחרי כל עורכי הטקסט שגלויים בתצוגה.

  3. מעקב אחר אירועי תנועה שהתקבלו בתצוגה ב- dispatchTouchEvent()

    • כשתנועת סטיילוס מתרחשת בתוך הגבולות של כתב היד בכלי לעריכת טקסט, מתמקדים בכלי לעריכת טקסט (אם המיקוד לא מתמקד כבר).

    • אם העורך לא היה כבר ממוקד, הפעל מחדש את ה-IME של העורך עם עורך חדש התקשרות אל התוכן InputMethodManager#restartInput()

    • כדי להתחיל את הפעילות של כתיבה ידנית בסטיילוס, צריך להתקשר InputMethodManager#startStylusHandwriting()

אם הכלי לעריכת טקסט נמצא בתוך תצוגה שיש בה אפשרות גלילה, תנועת סטיילוס גבולות כתב היד של העורך צריכים להיחשב ככתב יד, ולא כגלילה. כדאי להשתמש ViewParent#requestDisallowInterceptTouchEvent() כדי למנוע מתצוגת הורה שניתנת לגלילה ליירט אירועי מגע מטקסט עם הרשאת עריכה.

פרטי ה-API

  • MotionEvent#getToolType() – מציין אם הערך בשדה MotionEvent הוא מסטיילוס, ובמקרה כזה הערך המוחזר הוא TOOL_TYPE_STYLUS או TOOL_TYPE_ERASER.

  • InputMethodManager#isStylusHandwritingAvailable() — מציין אם ה-IME תומך בכתב יד בסטיילוס. רוצה להתקשר? אמצעי תשלום לפני כל קריאה ל-InputMethodManager#startStylusHandwriting() מפני שהזמינות של כתב היד השתנתה.

  • InputMethodManager#startStylusHandwriting() — גורם ל-IME לעבור למצב כתב יד. ACTION_CANCEL אירוע תנועה נשלח לאפליקציה כדי לבטל את התנועה הנוכחית. סטיילוס אירועי תנועה כבר לא נשלחים לאפליקציה.

    אירועי תנועת סטיילוס של התנועה הנוכחית שכבר נשלחו אל האפליקציות מועברות ל-IME. ה-IME נדרש כדי להציג דיו של סטיילוס חלון שדרכו ה-IME מקבל את כל האובייקטים הבאים של MotionEvent. ה-IME שומר טקסט כתב יד מזוהה באמצעות InputConnection ממשקי API.

    אם ה-IME לא יכול לעבור למצב כתב יד, הפעלת השיטה הזו היא ללא הפעלה.

הצהרה על תמיכה בכתיבה ידנית

כשממלאים את ארגומנט EditorInfo מתוך View#onCreateInputConnection(EditorInfo) שיחה setStylusHandwritingEnabled() כדי ליידע את ה-IME שעורך הטקסט תומך בכתב יד. הצהרה על תנועות נתמכות עם setSupportedHandwritingGestures() וגם setSupportedHandwritingGesturePreviews()

תמיכה בתנועות כתב יד

רכיבי IME יכולים לתמוך בתנועות שונות של כתב יד, כמו הקפת טקסט כדי לבחור או לשרבט על הטקסט כדי למחוק אותו.

איור 2. מקיפים בעיגול כדי לבחור טקסט.
איור 3. משרבטים כדי למחוק טקסט.

הטמעה של עורכים בהתאמה אישית InputConnection#performHandwritingGesture() וגם InputConnection#previewHandwritingGesture() כדי לתמוך HandwritingGesture שונים, כמו SelectGesture, DeleteGesture, וגם InsertGesture.

צריך להצהיר על תנועות כתב יד נתמכות כשממלאים את הארגומנט EditorInfo מתוך View#onCreateInputConnection(EditorInfo) (אפשר לעיין בכתב היד של ההצהרה support).

פרטי ה-API

  • InputConnection#performHandwritingGesture(HandwritingGesture, Executor, IntConsumer) – יישום תנועות. הארגומנט HandwritingGesture מכיל נתוני מיקום, שבהם אפשר להשתמש כדי לקבוע איפה בטקסט לבצע את התנועה. לדוגמה, SelectGesture מספק אובייקט RectF ש מציין את טווח הטקסט שנבחר, ו-InsertGesture מספק אובייקט PointF מציין את היסט הטקסט שבו יש להוסיף טקסט.

    להשתמש בExecutor IntConsumer פרמטרים כדי לשלוח בחזרה את תוצאת הפעולה. כשגם האופרטור וגם סופקו ארגומנטים לצרכנים, השתמשו בפעולה כדי להפעיל IntConsumer#accept() לדוגמה:

    
    executor.execute { consumer.accept(HANDWRITING_GESTURE_RESULT_SUCCESS) }
    
    
  • HandwritingGesture#getFallbackText() — מספקת טקסט חלופי שה-IME מתחייב במיקום הסמן אם לא הטקסט הרלוונטי נמצא מתחת לאזור של התנועה של כתב היד.

    לפעמים ה-IME לא מצליח לקבוע אם תנועה של סטיילוס שמטרתו לבצע פעולת תנועה או לכתוב טקסט בכתב יד. טקסט בהתאמה אישית העורך אחראי לקביעת כוונת המשתמש וביצועיו הפעולה המתאימה (בהתאם להקשר) במיקום התנועה.

    לדוגמה, אם ה-IME לא יכול לקבוע אם המשתמש התכוון לשרטט סמן טקסט למטה ⋁ כדי לבצע תנועת הוספת רווח או כדי לכתוב בכתב יד האות v, ה-IME יכול לשלוח InsertGesture עם טקסט חלופי "v".

    קודם כל העורך צריך לנסות לבצע את התנועה של הוספת רווח. אם לא ניתן לבצע את התנועה (לדוגמה, אין טקסט במיקום) שצוין), העורך אמור לחזור ולהוסיף 'v' בסמן המיקום.

  • InputConnection#previewHandwritingGesture(PreviewableHandwritingGesture, CancellationSignal) — תצוגה מקדימה של תנועה מתמשכת. לדוגמה, כשהמשתמש מתחיל לצייר בתוך עיגול סביב טקסט מסוים, אפשר להשתמש בתצוגה מקדימה בזמן אמת של הבחירה שתתקבל מוצגות ומתעדכנות כל הזמן ככל שהמשתמש ממשיך לשרטט. רק מוצרים מסוימים סוגי התנועות ניתנים לתצוגה מקדימה PreviewableHandwritingGesture).

    ה-IME יכול להשתמש בפרמטר CancellationSignal כדי לבטל את תצוגה מקדימה. אם אירועים אחרים מפריעים לתצוגה המקדימה (לדוגמה, הטקסט משתנה מתבצעות פקודות InputConnection באופן פרוגרמטי או חדשות), העורך בהתאמה אישית יכול לבטל את התצוגה המקדימה.

    תנועות של תצוגה מקדימה מיועדות לתצוגה בלבד והן לא יכולות לשנות את התגובה של העורך . לדוגמה, תצוגה מקדימה של SelectGesture מסתירה את ההגדרה הנוכחית של העורך טווח הבחירה ומדגישה את טווח התצוגה המקדימה של התנועה. אבל ברגע שה התצוגה המקדימה בוטלה, העורך אמור לשחזר את טווח הבחירה הקודם שלו.

ספק נתוני מיקום של הסמן ונתוני מיקום אחרים

במצב כתב יד, ה-IME יכול לבקש את מיקום הסמן ונתוני מיקום אחרים באמצעות InputConnection#requestCursorUpdates() התגובה של העורך בהתאמה אישית כוללת קריאה ל- InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo) הנתונים ב- CursorAnchorInfo הרלוונטיים לכתיבה ידנית בסטיילוס, מסופקת באמצעות CursorAnchorInfo.Builder אמצעי תשלום:

  • setInsertionMarkerLocation() – מגדיר את מיקום הסמן. ה-IME משתמש בערך כדי להנפיש כתיבה ידנית למיקום של הסמן.
  • setEditorBoundsInfo() — מגדיר את הגבולות של העורך ואת גבולות כתב היד. ה-IME משתמש נתונים אלה כדי למקם את סרגל הכלים של כתב היד של ה-IME על המסך.
  • addVisibleLineBounds() — מגדיר את הגבולות של כל שורות הטקסט הגלויות (או הגלויות חלקית) של בעורך. ה-IME משתמש בגבולות הקו כדי לשפר את הדיוק ב תנועות של כתב יד.
  • setTextAppearanceInfo() – מגדיר את מראה הטקסט בעזרת מידע שנגזר מהטקסט שדה להזנת קלט. ה-IME משתמש במידע כדי לעצב את הדיו של כתב היד.

הצגת הסמל של העברת העכבר מעל לכתיבה ידנית בסטיילוס

הצגת הסמל של העברת כתב היד בסטיילוס כשהסטיילוס מרחף מעל גבולות כתב היד של עורך הטקסט המותאם אישית שלך ושל ה-IME שנבחר כתיבה ידנית בסטיילוס InputMethodManager#isStylusHandwritingAvailable().

שינוי מברירת המחדל View#onResolvePointerIcon() כדי לראות סמל של העברת העכבר מעל לכתיבה ידנית בסטיילוס. בברירת המחדל, מפעילים PointerIcon.getSystemIcon(context, PointerIcon.TYPE_HANDWRITING) כדי לגשת לסמל הכתיבה הידנית בסטיילוס של המערכת.

מקורות מידע נוספים