বড় পর্দায় ইনপুট সামঞ্জস্যতা

বড় স্ক্রিনের ডিভাইসে, ব্যবহারকারীরা প্রায়ই কীবোর্ড, মাউস, ট্র্যাকপ্যাড, স্টাইলাস বা গেমপ্যাড ব্যবহার করে অ্যাপের সাথে ইন্টার‍্যাক্ট করেন। আপনার অ্যাপকে বাহ্যিক ডিভাইস থেকে ইনপুট গ্রহণ করার অনুমতি দিতে, নিম্নলিখিতগুলি করুন:

  • বেসিক কীবোর্ড সাপোর্ট টেস্ট করুন, যেমন আগের অবস্থায় ফিরিয়ে আনার জন্য Ctrl+Z, কপি করার জন্য Ctrl+C এবং সেভ করার জন্য Ctrl+S। ডিফল্ট কীবোর্ড শর্টকাটের তালিকা দেখতে কীবোর্ড অ্যাকশন ম্যানেজ করুন বিকল্প দেখুন।
  • উন্নত কীবোর্ড সাপোর্ট পরীক্ষা করুন, যেমন, Tab কী এবং তীরচিহ্ন কী কীবোর্ড নেভিগেশন, Enter কী টেক্সট এন্ট্রি কনফার্মেশন, এবং মিডিয়া অ্যাপে Spacebar প্লে এবং পজ।
  • মাউসের প্রাথমিক ইন্টার‍্যাকশন পরীক্ষা করুন, যার মধ্যে রয়েছে প্রসঙ্গ মেনুর জন্য ডানদিকের বোতামে ক্লিক করা, হোভার করার সময় আইকন পরিবর্তন এবং কাস্টম কম্পোনেন্টে মাউস হুইল বা ট্র্যাকপ্যাড স্ক্রল ইভেন্ট।
  • অ্যাপ-নির্দিষ্ট ইনপুট ডিভাইস টেস্ট করুন যেমন স্টাইলাস, গেম কন্ট্রোলার এবং মিউজিক অ্যাপ MIDI কন্ট্রোলার।
  • উন্নত ইনপুট সাপোর্ট বিবেচনা করুন যা অ্যাপটিকে ডেস্কটপ এনভায়রনমেন্টে আলাদা করে তুলতে পারে, যেমন, DJ অ্যাপের জন্য ক্রস‑ফেডার হিসেবে টাচপ্যাড, গেমের জন্য মাউস ক্যাপচার এবং কীবোর্ড‑কেন্দ্রিক ব্যবহারকারীদের জন্য কীবোর্ড শর্টকাট।

কীবোর্ড

কীবোর্ড ইনপুটে আপনার অ্যাপ যেভাবে সাড়া দেয় তা বড় স্ক্রিনে ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে। তিন ধরনের কীবোর্ড ইনপুট আছে: নেভিগেশন, কীস্ট্রোক এবং শর্টকাট।

টাচ-সেন্ট্রিক অ্যাপে কীবোর্ড নেভিগেশন খুব কমই প্রয়োগ করা হয়, তবে ব্যবহারকারীরা অ্যাপ ব্যবহার করার সময় কীবোর্ডে হাত থাকলে এটি আশা করেন। অ্যাক্সেসিবিলিটি সংক্রান্ত প্রয়োজন আছে এমন ব্যবহারকারীদের জন্য ফোন, ট্যাবলেট, ফোল্ডেবল ও ডেস্কটপ ডিভাইসে কীবোর্ড নেভিগেশন অত্যন্ত গুরুত্বপূর্ণ হতে পারে।

অনেক অ্যাপের ক্ষেত্রে, তীরচিহ্ন কী এবং ট্যাব কী নেভিগেশন Android ফ্রেমওয়ার্কের মাধ্যমে অটোমেটিক ম্যানেজ করা হয়। যেমন, কম্পোজ করা যায় এমন কিছু আইটেম সাধারণত ফোকাস করা যায়, যেমন Button বা কম্পোজ করা যায় এমন আইটেম যাতে clickable মডিফায়ার আছে; কীবোর্ড নেভিগেশন সাধারণত কোনও অতিরিক্ত কোড ছাড়াই কাজ করে। ডিফল্ট হিসেবে ফোকাস করা যায় না এমন কাস্টম কম্পোজেবলের জন্য কীবোর্ড নেভিগেশন চালু করতে, focusable মডিফায়ার যোগ করুন:

var color by remember { mutableStateOf(Green) }
Box(
    Modifier
        .background(color)
        .onFocusChanged { color = if (it.isFocused) Blue else Green }
        .focusable()
) {
    Text("Focusable 1")
}

আরও তথ্যের জন্য, কম্পোজেবলকে ফোকাসযোগ্য করা দেখুন।

ফোকাস চালু করা হলে, Android ফ্রেমওয়ার্ক সব ফোকাস করা যায় এমন কম্পোনেন্টের জন্য তাদের অবস্থানের উপর ভিত্তি করে একটি নেভিগেশনাল ম্যাপিং তৈরি করে। এটি সাধারণত প্রত্যাশা অনুযায়ী কাজ করে এবং আর কোনও ডেভেলপমেন্টের প্রয়োজন হয় না।

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

ফোকাস আচরণ নিয়ন্ত্রণ করতে, কম্পোজেবলের সংগ্রহের প্যারেন্ট কম্পোজেবলে focusGroup মডিফায়ার যোগ করুন। ফোকাস গ্রুপে চলে যায়, তারপর পরবর্তী ফোকাস করা যায় এমন কম্পোনেন্টে যাওয়ার আগে গ্রুপের মধ্যে দিয়ে যায়, যেমন:

Row {
    Column(Modifier.focusGroup()) {
        Button({}) { Text("Row1 Col1") }
        Button({}) { Text("Row2 Col1") }
        Button({}) { Text("Row3 Col1") }
    }
    Column(Modifier.focusGroup()) {
        Button({}) { Text("Row1 Col2") }
        Button({}) { Text("Row2 Col2") }
        Button({}) { Text("Row3 Col2") }
    }
}

আরও তথ্যের জন্য, ফোকাস গ্রুপের সাথে সামঞ্জস্যপূর্ণ নেভিগেশন প্রদান করুন দেখুন।

শুধুমাত্র কীবোর্ড ব্যবহার করে আপনার অ্যাপের প্রতিটি UI এলিমেন্ট অ্যাক্সেস করার সুবিধা পরীক্ষা করুন। ঘনঘন ব্যবহার করা এলিমেন্ট মাউস বা টাচ ইনপুট ছাড়াই অ্যাক্সেসযোগ্য হতে হবে।

মনে রাখবেন, অ্যাক্সেসিবিলিটি সংক্রান্ত প্রয়োজনীয়তা আছে এমন ব্যবহারকারীদের জন্য কীবোর্ড সাপোর্ট প্রয়োজন হতে পারে।

কীস্ট্রোক

স্ক্রিনে দেখানো ভার্চুয়াল কীবোর্ড (IME) দিয়ে টেক্সট ইনপুট করার জন্য, যেমন TextField , বড় স্ক্রিনের ডিভাইসে অ্যাপের আচরণ প্রত্যাশিত হওয়া উচিত এবং এর জন্য অতিরিক্ত ডেভেলপমেন্টের কাজ করার প্রয়োজন নেই। ফ্রেমওয়ার্কের মাধ্যমে অনুমান করা যায় না এমন কিস্ট্রোকের জন্য, অ্যাপকে নিজেই আচরণ ম্যানেজ করতে হবে। কাস্টম ভিউ সহ অ্যাপের ক্ষেত্রে এটি বিশেষভাবে প্রযোজ্য।

কিছু উদাহরণ হল চ্যাট অ্যাপ যা মেসেজ পাঠাতে Enter কী ব্যবহার করে, মিডিয়া অ্যাপ যা Spacebar দিয়ে প্লেব্যাক শুরু ও বন্ধ করে এবং গেম যা w, a, s এবং d কী দিয়ে মুভমেন্ট নিয়ন্ত্রণ করে।

আপনি onKeyEvent মডিফায়ারের মাধ্যমে আলাদা আলাদা কীস্ট্রোক ম্যানেজ করতে পারবেন, যা মডিফাই করা কম্পোনেন্ট কোনও কী ইভেন্ট পেলে কল করা ল্যাম্বডাকে গ্রহণ করে। KeyEvent#type প্রপার্টি আপনাকে নির্ধারণ করতে দেয় যে ইভেন্টটি কী প্রেস (KeyDown) নাকি কী রিলিজ (KeyUp):

Box(
    modifier = Modifier.focusable().onKeyEvent {
        if(
            it.type == KeyEventType.KeyUp &&
            it.key == Key.S
        ) {
            doSomething()
            true
        } else {
            false
        }
    }
)  {
    Text("Press S key")
}

বিকল্প হিসেবে, আপনি onKeyUp() কলব্যাক ওভাররাইড করতে এবং প্রতিটি প্রাপ্ত কীকোডের জন্য প্রত্যাশিত আচরণ যোগ করতে পারেন:

kotlin override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_ENTER -> { sendChatMessage() true } KeyEvent.KEYCODE_SPACE -> { playOrPauseMedia() true } else -> super.onKeyUp(keyCode, event) } }

কোনও কী রিলিজ করা হলে onKeyUp ইভেন্ট ঘটে। কলব্যাক ব্যবহার করলে, কোনও কী চেপে ধরে থাকলে বা ধীরে ধীরে ছেড়ে দিলে, অ্যাপকে একাধিক onKeyDown ইভেন্ট প্রসেস করতে হয় না। যেসব গেম ও অ্যাপে কোনও কী প্রেস করার মুহূর্ত শনাক্ত করতে হয় অথবা ব্যবহারকারী কোনও কী প্রেস করে ধরে আছেন কিনা তা জানতে হয়, সেগুলি onKeyDown ইভেন্ট শুনতে পারে এবং বারবার হওয়া onKeyDown ইভেন্ট নিজেরাই ম্যানেজ করতে পারে।

আরও তথ্যের জন্য, কীবোর্ড অ্যাকশন ম্যানেজ করুন দেখুন।

শর্টকাট

হার্ডওয়্যার কীবোর্ড ব্যবহার করার সময় Ctrl, Alt, Shift ও Meta কী সহ সাধারণ কীবোর্ড শর্টকাট ব্যবহার করা যাবে বলে আশা করা হয়। কোনও অ্যাপ শর্টকাট প্রয়োগ না করলে, ব্যবহারকারীর অভিজ্ঞতা হতাশাজনক হতে পারে। উন্নত ব্যবহারকারীরাও ঘন ঘন ব্যবহৃত অ্যাপ-নির্দিষ্ট টাস্কের জন্য শর্টকাট পছন্দ করেন। শর্টকাট কোনও অ্যাপকে আরও সহজে ব্যবহার করতে সাহায্য করে এবং শর্টকাট নেই এমন অ্যাপ থেকে এটিকে আলাদা করে।

কিছু সাধারণ শর্টকাটের মধ্যে রয়েছে Ctrl+S (সেভ করুন), Ctrl+Z (আগের অবস্থায় ফেরান) এবং Ctrl+Shift+Z (আবার করুন)। ডিফল্ট শর্টকাটের তালিকা দেখতে, কীবোর্ড অ্যাকশন ম্যানেজ করুন দেখুন।

KeyEvent অবজেক্টে নিম্নলিখিত অ্যাট্রিবিউট থাকে যা মডিফায়ার কী প্রেস করা হয়েছে কিনা তা নির্দেশ করে:

যেমন:

Box(
    Modifier.onKeyEvent {
        if (it.isAltPressed && it.key == Key.A) {
            println("Alt + A is pressed")
            true
        } else {
            false
        }
    }
    .focusable()
)

আরও তথ্যের জন্য, নিম্নলিখিত বিষয়গুলি দেখুন:

স্টাইলাস

অনেক বড় স্ক্রিনের ডিভাইসে স্টাইলাস থাকে। Android অ্যাপ স্টাইলাসকে টাচস্ক্রিন ইনপুট হিসেবে ম্যানেজ করে। কিছু ডিভাইসে USB বা ব্লুটুথ ড্রয়িং টেবিলও থাকতে পারে, যেমন Wacom Intuos। Android অ্যাপ ব্লুটুথ ইনপুট গ্রহণ করতে পারে কিন্তু USB ইনপুট নয়।

স্টাইলাস MotionEvent অবজেক্ট অ্যাক্সেস করতে, ড্রয়িং সারফেসে pointerInteropFilter মডিফায়ার যোগ করুন। এমন একটি পদ্ধতি সহ ViewModel ক্লাস প্রয়োগ করুন যা মোশন ইভেন্ট প্রসেস করে; পদ্ধতিটি pointerInteropFilter মডিফায়ারের onTouchEvent ল্যাম্বডা হিসেবে পাস করুন:

@Composable
@OptIn(ExperimentalComposeUiApi::class)
fun DrawArea(modifier: Modifier = Modifier) {
   Canvas(modifier = modifier
       .clipToBounds()
       .pointerInteropFilter {
           viewModel.processMotionEvent(it)
       }

   ) {
       // Drawing code here.
   }
}

MotionEvent অবজেক্টে ইভেন্ট সম্পর্কে তথ্য থাকে:

ঐতিহাসিক পয়েন্ট

Android ইনপুট ইভেন্ট ব্যাচ করে এবং ফ্রেম প্রতি একবার সেগুলি ডেলিভার করে। স্টাইলাস, ডিসপ্লের তুলনায় অনেক বেশি ফ্রিকোয়েন্সিতে ইভেন্ট রিপোর্ট করতে পারে। ড্রয়িং অ্যাপ তৈরি করার সময়, getHistorical API ব্যবহার করে সাম্প্রতিক অতীতে ঘটে থাকতে পারে এমন ইভেন্ট চেক করুন:

পাম রিজেকশন

ব্যবহারকারীরা যখন স্টাইলাস ব্যবহার করে আপনার অ্যাপে আঁকেন, লেখেন বা ইন্টার‍্যাক্ট করেন, তখন তারা কখনও কখনও হাতের তালু দিয়ে স্ক্রিন স্পর্শ করেন। সিস্টেম অসাবধানতাবশত হাতের তালুর স্পর্শ শনাক্ত ও উপেক্ষা করার আগে টাচ ইভেন্ট (ACTION_DOWN বা ACTION_POINTER_DOWN-এ সেট করা) আপনার অ্যাপে রিপোর্ট করা যেতে পারে।

Android একটি MotionEvent ডিসপ্যাচ করে পাম টাচ ইভেন্ট বাতিল করে। আপনার অ্যাপ ACTION_CANCEL পেলে, জেসচার বাতিল করুন। আপনার অ্যাপ ACTION_POINTER_UP পেলে, FLAG_CANCELED সেট করা আছে কিনা তা চেক করুন। যদি তাই হয়, তাহলে জেসচার বাতিল করুন।

শুধু FLAG_CANCELED-এর জন্য চেক করবেন না। Android 13 (API লেভেল ৩৩) এবং তার পরবর্তী ভার্সনে, সিস্টেম ACTION_CANCEL ইভেন্টের জন্য FLAG_CANCELED সেট করে, কিন্তু সিস্টেম Android-এর পুরনো ভার্সনে ফ্ল্যাগ সেট করে না।

Android 12

Android 12 (API লেভেল 32) এবং তার আগের ভার্সনে, পাম রিজেকশন শনাক্ত করা শুধুমাত্র সিঙ্গেল-পয়েন্টার টাচ ইভেন্টের জন্য সম্ভব। যদি তালুর স্পর্শই একমাত্র পয়েন্টার হয়, তাহলে সিস্টেম মোশন ইভেন্ট অবজেক্টে ACTION_CANCEL সেট করে ইভেন্টটি বাতিল করে। অন্যান্য পয়েন্টার ডাউন থাকলে, সিস্টেম ACTION_POINTER_UP সেট করে, যা পাম রিজেকশন শনাক্ত করার জন্য যথেষ্ট নয়।

Android 13

Android 13 (API লেভেল 33) এবং তার পরবর্তী ভার্সনে, তালুর স্পর্শই যদি একমাত্র পয়েন্টার হয়, তাহলে সিস্টেম মোশন ইভেন্ট অবজেক্টে ACTION_CANCEL এবং FLAG_CANCELED সেট করে ইভেন্ট বাতিল করে দেয়। অন্যান্য পয়েন্টার কম থাকলে, সিস্টেম ACTION_POINTER_UP এবং FLAG_CANCELED সেট করে।

আপনার অ্যাপ যখনই ACTION_POINTER_UP সহ কোনও মোশন ইভেন্ট পায়, তখন FLAG_CANCELED চেক করে দেখুন যে ইভেন্টটি পাম রিজেকশন (বা অন্য কোনও ইভেন্ট বাতিলকরণ) নির্দেশ করে কিনা।

নোট-নেওয়ার অ্যাপ

ChromeOS-এর একটি বিশেষ ইনটেন্ট আছে যা ব্যবহারকারীদের কাছে রেজিস্টার করা নোট‑নেওয়ার অ্যাপ দেখায়। কোনও অ্যাপকে নোট নেওয়ার অ্যাপ হিসেবে রেজিস্টার করতে, আপনার অ্যাপ ম্যানিফেস্টে নিম্নলিখিত তথ্য যোগ করুন:

<intent-filter>
    <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

সিস্টেমে কোনও অ্যাপ রেজিস্টার করা হলে, ব্যবহারকারী সেটিকে ডিফল্ট নোট নেওয়ার অ্যাপ হিসেবে বেছে নিতে পারেন। নতুন নোটের অনুরোধ করা হলে, অ্যাপটিকে স্টাইলাস ইনপুটের জন্য প্রস্তুত একটি খালি নোট তৈরি করতে হবে। ব্যবহারকারী কোনও ছবিতে অ্যানোটেট করতে চাইলে (যেমন স্ক্রিনশট বা ডাউনলোড করা ছবি), অ্যাপটি ClipData-এর সাথে চালু হয় যার মধ্যে content:// URI সহ এক বা একাধিক আইটেম থাকে। অ্যাপটি এমন একটি নোট তৈরি করবে যা প্রথম অ্যাটাচ করা ছবিটিকে ব্যাকগ্রাউন্ড ছবি হিসেবে ব্যবহার করবে এবং এমন একটি মোডে প্রবেশ করবে যেখানে ব্যবহারকারী স্টাইলাস দিয়ে স্ক্রিনে আঁকতে পারবেন।

স্টাইলাস ছাড়াই নোট-নেওয়ার ইনটেন্ট পরীক্ষা করুন

কোনও অ্যাপ অ্যাক্টিভ স্টাইলাস ছাড়াই নোট নেওয়ার ইনটেন্টে সঠিকভাবে সাড়া দেয় কিনা তা পরীক্ষা করতে, ChromeOS-এ নোট নেওয়ার বিকল্পগুলি দেখাতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:

  1. ডেভ মোডে পাল্টে নিন এবং ডিভাইস রাইটেবল করুন
  2. টার্মিনাল খুলতে Ctrl+Alt+F2 প্রেস করুন
  3. sudo vi /etc/chrome_dev.conf কমান্ড রান করুন
  4. এডিট করতে i প্রেস করুন এবং ফাইলের শেষে নতুন লাইনে --ash-enable-palette যোগ করুন
  5. Esc প্রেস করে সেভ করুন এবং তারপর :, w, q টাইপ করে Enter প্রেস করুন
  6. নিয়মিত ChromeOS UI-তে ফিরে যেতে Ctrl+Alt+F1 প্রেস করুন
  7. লগ-আউট করে আবার লগ-ইন করুন

স্টাইলাস মেনু এখন শেল্ফে থাকা উচিত:

  • শেল্ফে স্টাইলাস বোতামে ট্যাপ করে নতুন নোট বিকল্প বেছে নিন। এটি করলে একটি ফাঁকা ড্রয়িং নোট খুলবে।
  • একটি স্ক্রিনশট নিন। শেল্ফ থেকে, স্টাইলাস বোতাম > স্ক্রিন ক্যাপচার করুন বিকল্প বেছে নিন অথবা কোনও ছবি ডাউনলোড করুন। বিজ্ঞপ্তিতে ছবি অ্যানোটেট করুন বিকল্প থাকা উচিত। এটি অ্যানোটেট করার জন্য প্রস্তুত ছবি সহ অ্যাপটি চালু করবে।

মাউস ও টাচপ্যাড কাজ করে

বেশিরভাগ অ্যাপকে সাধারণত বড় স্ক্রিন–কেন্দ্রিক মাত্র তিনটি ইভেন্ট ম্যানেজ করতে হয়: ডানদিকের বোতামে ক্লিক করা, হোভার করা এবং টেনে নিয়ে রাখা।

ডানদিকের বোতামে ক্লিক করুন

যেসব অ্যাকশনের ফলে অ্যাপে কনটেক্সট মেনু দেখা যায়, যেমন তালিকার কোনও আইটেম টাচ করে ধরে থাকা, সেগুলি ডানদিকের বোতামে ক্লিক করার ইভেন্টেও কাজ করা উচিত।

রাইট‑ক্লিক ইভেন্ট ম্যানেজ করতে, অ্যাপকে View.OnContextClickListener রেজিস্টার করতে হবে:

Box(modifier = Modifier.fillMaxSize()) {
    AndroidView(
        modifier = Modifier.fillMaxSize(),
        factory = { context ->
            val rootView = FrameLayout(context)
            val onContextClickListener =
                View.OnContextClickListener { view ->
                    showContextMenu()
                    true
                }
            rootView.setOnContextClickListener(onContextClickListener)
            rootView
        },
    )
}

সংশ্লিষ্ট মেনু তৈরি করার বিষয়ে আরও জানতে, সংশ্লিষ্ট মেনু তৈরি করুন দেখুন।

উপরে নিয়ে যাওয়া

হোভার ইভেন্ট ম্যানেজ করার মাধ্যমে আপনি অ্যাপ লেআউট আরও আকর্ষণীয় ও সহজে ব্যবহারযোগ্য করে তুলতে পারেন। এটি বিশেষ করে কাস্টম কম্পোনেন্টের ক্ষেত্রে প্রযোজ্য:

এর দুটি সবচেয়ে সাধারণ উদাহরণ হল:

  • মাউস পয়েন্টার আইকন পরিবর্তন করে, কোনও এলিমেন্টের ইন্টার‍্যাক্টিভ আচরণ আছে কিনা তা ব্যবহারকারীদের দেখানো, যেমন ক্লিক করা বা এডিট করা যায় কিনা
  • পয়েন্টার কোনও বড় তালিকা বা গ্রিডের আইটেমের উপর ঘোরালে, আইটেমে ভিজ্যুয়াল ফিডব্যাক যোগ করা

ড্র্যাগ করে ড্রপ করুন

মাল্টি-উইন্ডো এনভায়রনমেন্টে, ব্যবহারকারীরা আশা করেন যে তারা অ্যাপের মধ্যে আইটেম টেনে নিয়ে রাখতে পারবেন। এটি ডেস্কটপ ডিভাইসের পাশাপাশি ট্যাবলেট, ফোন এবং বিভক্ত-স্ক্রীন মোডে ফোল্ডেবল ডিভাইসের ক্ষেত্রেও প্রযোজ্য।

ব্যবহারকারীরা আপনার অ্যাপে আইটেম টেনে আনতে পারেন কিনা তা বিবেচনা করুন। যেমন, ফটো এডিটরদের ফটো, অডিও প্লেয়ারদের অডিও ফাইল এবং ড্রয়িং প্রোগ্রামগুলির ফটো পাওয়ার আশা করা উচিত।

টেনে নিয়ে রাখার সুবিধা যোগ করতে, টেনে নিয়ে রাখুন দেখুন এবং ChromeOS-এ Android — টেনে নিয়ে রাখার সুবিধা প্রয়োগ করা ব্লগ পোস্টটি দেখুন।

ChromeOS-এর জন্য বিশেষ বিবেচনা

উন্নত পয়েন্টার সহায়তা

যেসব অ্যাপ মাউস ও টাচপ্যাড ইনপুট উন্নতভাবে ম্যানেজ করে, সেগুলির ক্ষেত্রে PointerEvent পেতে pointerInput মডিফায়ার প্রয়োগ করতে হবে:

@Composable
private fun LogPointerEvents(filter: PointerEventType? = null) {
    var log by remember { mutableStateOf("") }
    Column {
        Text(log)
        Box(
            Modifier
                .size(100.dp)
                .background(Color.Red)
                .pointerInput(filter) {
                    awaitPointerEventScope {
                        while (true) {
                            val event = awaitPointerEvent()
                            // handle pointer event
                            if (filter == null || event.type == filter) {
                                log = "${event.type}, ${event.changes.first().position}"
                            }
                        }
                    }
                }
        )
    }
}

নিম্নলিখিত বিষয়গুলি নির্ধারণ করতে PointerEvent অবজেক্ট পরীক্ষা করুন:

  • PointerType: মাউস, স্টাইলাস, টাচ এবং আরও অনেক কিছু PointerEvent#changes থেকে
  • PointerEventType: পয়েন্টার অ্যাকশন, যেমন প্রেস, সরানো, স্ক্রল করা এবং রিলিজ করা

গেম কন্ট্রোলার

কিছু বড় স্ক্রিনের Android ডিভাইসে সর্বাধিক চারটি গেম কন্ট্রোলার কাজ করে। গেম কন্ট্রোলার ম্যানেজ করতে স্ট্যান্ডার্ড Android গেম কন্ট্রোলার API ব্যবহার করুন (গেম কন্ট্রোলার সমর্থন করে দেখুন)।

গেম কন্ট্রোলার বোতামগুলি সাধারণ ম্যাপিং অনুসরণ করে সাধারণ মানগুলিতে ম্যাপ করা হয়। তবে, সব গেম কন্ট্রোলার প্রস্তুতকারক একই ম্যাপিং কনভেনশন অনুসরণ করে না। আপনি ব্যবহারকারীদের বিভিন্ন জনপ্রিয় কন্ট্রোলার ম্যাপিং বেছে নেওয়ার অনুমতি দিলে, আরও অনেক ভালো অভিজ্ঞতা প্রদান করতে পারবেন। আরও তথ্যের জন্য গেমপ্যাড বোতাম প্রেস করার প্রসেস দেখুন।

ইনপুট অনুবাদ মোড

ChromeOS ডিফল্ট হিসেবে ইনপুট ট্রান্সলেশন মোড চালু করে। বেশিরভাগ Android অ্যাপের ক্ষেত্রে, এই মোড ডেস্কটপ এনভায়রনমেন্টে অ্যাপকে প্রত্যাশা অনুযায়ী কাজ করতে সাহায্য করে। কিছু উদাহরণের মধ্যে রয়েছে টাচপ্যাডে অটোমেটিক দুই আঙুল দিয়ে স্ক্রল করার সুবিধা চালু করা, মাউস হুইল স্ক্রল করা এবং উইন্ডো কোঅর্ডিনেটে র-ডিসপ্লে কোঅর্ডিনেট ম্যাপ করা। সাধারণত, অ্যাপ ডেভেলপারদের নিজেদের এইসব আচরণ প্রয়োগ করতে হয় না।

কোনও অ্যাপ যদি কাস্টম ইনপুট আচরণ প্রয়োগ করে, যেমন কাস্টম দুটি আঙুলের টাচপ্যাড পিঞ্চ অ্যাকশন সংজ্ঞায়িত করা, অথবা এই ইনপুট অনুবাদগুলি অ্যাপের প্রত্যাশিত ইনপুট ইভেন্টগুলি প্রদান না করলে, আপনি Android ম্যানিফেস্টে নিম্নলিখিত ট্যাগ যোগ করে ইনপুট অনুবাদ মোড বন্ধ করতে পারেন:

<uses-feature
    android:name="android.hardware.type.pc"
    android:required="false" />

অতিরিক্ত রিসোর্স