কাস্টম পাঠ্য সম্পাদক

কাস্টম টেক্সট এডিটর হল এমন ভিউ যা EditText কম্পোনেন্ট বা WebView টেক্সট উইজেট নয় কিন্তু তবুও onCreateInputConnection() কলব্যাক প্রয়োগ করে টেক্সট ইনপুট সমর্থন করে, যা বলা হয় যখন একটি ভিউ ফোকাস করা হয় এবং সিস্টেম ভিউটির জন্য একটি InputConnection অনুরোধ করে।

একটি কাস্টম টেক্সট এডিটর থেকে onCheckIsTextEditor() এ একটি কল true হওয়া উচিত।

কাস্টম টেক্সট এডিটরগুলিতে স্টাইলাস হস্তাক্ষর সমর্থন করুন

অ্যান্ড্রয়েড 14 (এপিআই স্তর 34) এবং ডিফল্টভাবে স্ট্যান্ডার্ড অ্যান্ড্রয়েড টেক্সট এন্ট্রি উপাদানগুলিতে উচ্চতর সমর্থন স্টাইলাস ইনপুট ( টেক্সট ফিল্ডে স্টাইলাস ইনপুট দেখুন)। যাইহোক, কাস্টম টেক্সট এন্ট্রি ক্ষেত্র (বা সম্পাদকদের) অতিরিক্ত উন্নয়ন প্রয়োজন।

একটি কাস্টম পাঠ্য সম্পাদক তৈরি করতে, নিম্নলিখিতগুলি করুন:

  1. হাতের লেখার সূচনা সক্ষম করুন
  2. হাতের লেখা সমর্থন ঘোষণা করুন
  3. হাতের লেখার অঙ্গভঙ্গি সমর্থন করুন (নির্বাচন করুন, মুছুন, সন্নিবেশ করুন এবং আরও অনেক কিছু)
  4. IME কে কার্সারের অবস্থান এবং অন্যান্য অবস্থানের ডেটা প্রদান করুন
  5. স্টাইলাস হস্তাক্ষর হোভার আইকন দেখান

হাতের লেখার সূচনা সক্ষম করুন

যদি একটি ভিউ শুধুমাত্র একটি একক টেক্সট এডিটর নিয়ে গঠিত হয়, তাহলে ভিউ সিস্টেম স্বয়ংক্রিয়ভাবে দৃশ্যের জন্য স্টাইলাস হস্তাক্ষর শুরু করতে পারে। অন্যথায়, দৃশ্যটিকে অবশ্যই তার নিজের হস্তাক্ষর দীক্ষা যুক্তি প্রয়োগ করতে হবে।

স্বয়ংক্রিয় হাতের লেখার দীক্ষা

যদি একটি ভিউ একটি একক টেক্সট এডিটর প্রদর্শন করে এবং অন্য কোন বিষয়বস্তু না থাকে, তাহলে ভিউটি setAutoHandwritingEnabled(true) কল করে ভিউ সিস্টেমের স্বয়ংক্রিয় হস্তাক্ষর সূচনা বেছে নিতে পারে।

স্বয়ংক্রিয় হস্তাক্ষর সক্ষম করার সাথে, দৃশ্যের হস্তাক্ষর সীমার মধ্যে যে কোনও জায়গায় শুরু হওয়া স্টাইলাস গতি স্বয়ংক্রিয়ভাবে হস্তাক্ষর মোড শুরু করে। ইনপুট মেথড এডিটর ( IME ) স্টাইলাস মোশন ইভেন্টগুলি গ্রহণ করে এবং স্বীকৃত পাঠ্য কমিট করে।

চারপাশের আয়তক্ষেত্র সহ ইনপুট ক্ষেত্র যা লেখনী গতি ঘটনা সনাক্তকরণের জন্য সীমা নির্দেশ করে।
চিত্র 1. একটি EditText ক্ষেত্রের সীমানার মধ্যে হাতের লেখা।

কাস্টম হস্তাক্ষর দীক্ষা

যদি একটি দৃশ্যে একটি একক পাঠ্য সম্পাদক ছাড়াও একাধিক পাঠ্য সম্পাদক বা বিষয়বস্তু থাকে, তাহলে ভিউটিকে অবশ্যই তার নিজের হস্তাক্ষর সূচনা যুক্তি প্রয়োগ করতে হবে:

  1. setAutoHandwritingEnabled(false) কল করে ভিউ সিস্টেমের স্বয়ংক্রিয় হস্তাক্ষর সূচনা থেকে অপ্ট আউট করুন৷

  2. দৃশ্যের মধ্যে দৃশ্যমান সমস্ত পাঠ্য সম্পাদকের ট্র্যাক রাখুন।

  3. dispatchTouchEvent() এ ভিউ দ্বারা প্রাপ্ত গতি ইভেন্টগুলি মনিটর করুন।

    • যখন টেক্সট এডিটরের হস্তাক্ষর সীমার মধ্যে স্টাইলাস গতি ঘটে, তখন টেক্সট এডিটরকে ফোকাস করুন (যদি ইতিমধ্যেই ফোকাস করা না থাকে)।

    • যদি সম্পাদক ইতিমধ্যেই ফোকাস না করে থাকে, InputMethodManager#restartInput() কল করে নতুন বিষয়বস্তু সহ সম্পাদকের IME পুনরায় চালু করুন।

    • 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 হস্তাক্ষর মোডে প্রবেশ করতে না পারে, এই পদ্ধতি কল একটি নো-অপ।

হাতের লেখা সমর্থন ঘোষণা করুন

View#onCreateInputConnection(EditorInfo) -এর EditorInfo আর্গুমেন্ট পূরণ করার সময় IME-কে জানাতে setStylusHandwritingEnabled() কল করুন যে টেক্সট এডিটর হাতের লেখা সমর্থন করে। setSupportedHandwritingGestures() এবং setSupportedHandwritingGesturePreviews() দিয়ে সমর্থিত অঙ্গভঙ্গি ঘোষণা করুন।

হাতের লেখার অঙ্গভঙ্গি সমর্থন করুন

IMEs বিভিন্ন হাতের লেখার অঙ্গভঙ্গি সমর্থন করতে পারে, যেমন পাঠ্যটি নির্বাচন করতে বৃত্তাকার করা বা এটি মুছে ফেলার জন্য পাঠ্যের উপর স্ক্রিবলিং করা।

চিত্র 2. পাঠ্য নির্বাচন করতে বৃত্ত।
চিত্র 3. টেক্সট মুছে ফেলার জন্য স্ক্রিবল।

কাস্টম এডিটররা InputConnection#performHandwritingGesture() এবং InputConnection#previewHandwritingGesture() প্রয়োগ করে বিভিন্ন HandwritingGesture ধরনকে সমর্থন করার জন্য, যেমন SelectGesture , DeleteGesture , এবং InsertGesture

View#onCreateInputConnection(EditorInfo) এর EditorInfo আর্গুমেন্ট পূরণ করার সময় সমর্থিত হাতের লেখার অঙ্গভঙ্গি ঘোষণা করুন ( হস্তাক্ষর সমর্থন বিভাগ ঘোষণা করুন )।

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 ফলব্যাক টেক্সট "v" সহ একটি InsertGesture পাঠাতে পারে।

    সম্পাদককে প্রথমে স্থানের অঙ্গভঙ্গি সন্নিবেশ করার চেষ্টা করা উচিত। যদি অঙ্গভঙ্গি সঞ্চালিত না হয় (উদাহরণস্বরূপ, নির্দিষ্ট স্থানে কোন পাঠ্য নেই), সম্পাদককে কার্সার অবস্থানে "v" সন্নিবেশ করাতে ফিরে যেতে হবে।

  • InputConnection#previewHandwritingGesture(PreviewableHandwritingGesture, CancellationSignal) — একটি চলমান অঙ্গভঙ্গির পূর্বরূপ দেখায়। উদাহরণস্বরূপ, ব্যবহারকারী যখন কিছু পাঠ্যের চারপাশে একটি বৃত্ত আঁকতে শুরু করেন, ফলে নির্বাচনের একটি লাইভ প্রিভিউ দেখানো যেতে পারে এবং ক্রমাগত আপডেট করা যেতে পারে যখন ব্যবহারকারী অঙ্কন চালিয়ে যান। শুধুমাত্র নির্দিষ্ট কিছু অঙ্গভঙ্গির ধরনই পূর্বরূপ দেখতে যোগ্য (দেখুন PreviewableHandwritingGesture )।

    প্রিভিউ বাতিল করতে IME দ্বারা CancellationSignal প্যারামিটার ব্যবহার করা যেতে পারে। যদি অন্যান্য ইভেন্টগুলি পূর্বরূপকে ব্যাহত করে (উদাহরণস্বরূপ, পাঠ্য প্রোগ্রামে পরিবর্তন করা হয় বা নতুন InputConnection কমান্ড আসে), কাস্টম সম্পাদক পূর্বরূপ বাতিল করতে পারে।

    পূর্বরূপ অঙ্গভঙ্গি শুধুমাত্র প্রদর্শনের জন্য এবং সম্পাদকের অবস্থা পরিবর্তন করা উচিত নয়। উদাহরণস্বরূপ, একটি SelectGesture পূর্বরূপ সম্পাদকের বর্তমান নির্বাচন পরিসর লুকিয়ে রাখে এবং অঙ্গভঙ্গি পূর্বরূপ পরিসর হাইলাইট করে। কিন্তু একবার প্রিভিউ বাতিল হয়ে গেলে, সম্পাদককে তার আগের নির্বাচনের পরিসর পুনরুদ্ধার করা উচিত।

কার্সার অবস্থান এবং অন্যান্য অবস্থান তথ্য প্রদান করুন

হস্তাক্ষর মোডে, IME InputConnection#requestCursorUpdates() ব্যবহার করে কার্সার অবস্থান এবং অন্যান্য অবস্থানের ডেটার অনুরোধ করতে পারে। কাস্টম সম্পাদক InputMethodManager#updateCursorAnchorInfo(View, CursorAnchorInfo) কলের সাথে সাড়া দেয়। স্টাইলাস হাতের লেখার সাথে প্রাসঙ্গিক CursorAnchorInfo এর ডেটা নিম্নলিখিত CursorAnchorInfo.Builder পদ্ধতির মাধ্যমে প্রদান করা হয়:

  • setInsertionMarkerLocation() — কার্সারের অবস্থান নির্ধারণ করে। IME কার্সার অবস্থানে হাতের লেখার কালি অ্যানিমেট করতে মান ব্যবহার করে।
  • setEditorBoundsInfo() — সম্পাদকের সীমানা এবং হাতের লেখার সীমা নির্ধারণ করে। আইএমই এই ডেটা ব্যবহার করে আইএমই-এর হাতের লেখা টুলবারকে স্ক্রিনে অবস্থান করতে।
  • addVisibleLineBounds() — সম্পাদকের সমস্ত দৃশ্যমান (বা আংশিকভাবে দৃশ্যমান) পাঠ্য লাইনের সীমা নির্ধারণ করে। IME হাতের লেখার অঙ্গভঙ্গি শনাক্ত করার ক্ষেত্রে নির্ভুলতা উন্নত করতে লাইন বাউন্ড ব্যবহার করে।
  • setTextAppearanceInfo() — টেক্সট ইনপুট ক্ষেত্র থেকে প্রাপ্ত তথ্য সহ পাঠ্যের উপস্থিতি সেট করে। IME হাতের লেখার কালি স্টাইল করার জন্য তথ্য ব্যবহার করে।

স্টাইলাস হস্তাক্ষর হোভার আইকন দেখান

আপনার কাস্টম টেক্সট এডিটরের হস্তাক্ষর সীমার উপর স্টাইলাস ঘোরার সময় স্টাইলাস হস্তাক্ষর হোভার আইকন প্রদর্শন করুন এবং নির্বাচিত IME স্টাইলাস হস্তাক্ষর সমর্থন করে ( InputMethodManager#isStylusHandwritingAvailable() )।

স্টাইলাস হস্তাক্ষরের জন্য একটি হোভার আইকন পেতে View#onResolvePointerIcon() ওভাররাইড করুন। ওভাররাইডে, সিস্টেমের স্টাইলাস হস্তাক্ষর হোভার আইকন অ্যাক্সেস করতে PointerIcon.getSystemIcon(context, PointerIcon.TYPE_HANDWRITING) এ কল করুন।

অতিরিক্ত সম্পদ