أدوات تحرير نصوص مخصّصة

محررات النص المخصصة هي طرق عرض لا مكونات EditText أو WebView أدوات نصية ولكن وندعم إدخال النص من خلال تنفيذ onCreateInputConnection() يتم استدعاء هذه العملية عندما يتم التركيز على إحدى طرق العرض ويطلب النظام InputConnection للعرض.

مكالمة إلى onCheckIsTextEditor() من محرِّر نصوص مخصّص يجب أن يعرض true

إتاحة الكتابة بخط اليد بقلم الشاشة في برامج تحرير النصوص المخصّصة

نظام التشغيل Android 14 (المستوى 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() لمنع عرض الأصل القابل للتمرير من اعتراض أحداث اللمس في النص المحرِّر.

تفاصيل واجهة برمجة التطبيقات

  • 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 واجهات برمجة التطبيقات.

    إذا تعذَّر على أداة IME الدخول إلى وضع الكتابة بخط اليد، لن يتم استدعاء هذه الطريقة.

إعلان إتاحة الكتابة بخط اليد

عند ملء الوسيطة EditorInfo من مكالمة View#onCreateInputConnection(EditorInfo) setStylusHandwritingEnabled() لإبلاغ أداة IME بأنّ محرِّر النصوص يتيح الكتابة بخط اليد. توضيح الإيماءات المتوافقة باستخدام setSupportedHandwritingGestures() أو setSupportedHandwritingGesturePreviews()

دعم إيماءات الكتابة بخط اليد

تتيح أدوات IME استخدام العديد من إيماءات الكتابة بخط اليد، مثل وضع دائرة حول النص لتحديده. أو الكتابة فوق النص لحذفه.

الشكل 2. دائرة لاختيار النص
الشكل 3. خربِش النص لحذفه.

تنفيذ المحرِّرين المخصّصين InputConnection#performHandwritingGesture() أو InputConnection#previewHandwritingGesture() لدعم مختلف HandwritingGesture أنواعها، مثل SelectGesture، DeleteGesture، InsertGesture.

يُرجى تعريف إيماءات الكتابة بخط اليد المتوافقة عند ملء الوسيطة EditorInfo. من View#onCreateInputConnection(EditorInfo) (راجع بيان الكتابة بخط اليد) الدعم).

تفاصيل واجهة برمجة التطبيقات

  • 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) للدخول إلى رمز التمرير بالكتابة بخط اليد بقلم الشاشة.

مصادر إضافية