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

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

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

কীবোর্ড

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

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

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

Kotlin

yourView.isFocusable = true

জাভা

yourView.setFocusable(true);

বিকল্প হিসেবে, আপনার লেআউট ফাইলে focusable অ্যাট্রিবিউট সেট করতে পারেন:

android:focusable="true"

আরও জানতে, ফোকাস হ্যান্ডলিং দেখুন।

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

Kotlin

// Arrow keys
yourView.nextFocusLeftId = R.id.view_to_left
yourView.nextFocusRightId = R.id.view_to_right
yourView.nextFocusTopId = R.id.view_above
yourView.nextFocusBottomId = R.id.view_below
// Tab key
yourView.nextFocusForwardId = R.id.next_view

জাভা

// Arrow keys
yourView.setNextFocusLeftId(R.id.view_to_left);
yourView.setNextFocusRightId(R.id.view_to_left);
yourView.setNextFocusTopId(R.id.view_to_left);
yourView.setNextFocusBottomId(R.id.view_to_left);
// Tab key
yourView.setNextFocusForwardId(R.id.next_view);

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

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

কীস্ট্রোক

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

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

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

Kotlin

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) } }

জাভা

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER) {
        sendMessage();
        return true;
    } else if (KeyEvent.KEYCODE_SPACE){
        playOrPauseMedia();
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}

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

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

শর্টকাট

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

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

প্রদত্ত কীকোডের জন্য সব কী কম্বিনেশন (Alt, Ctrl, Shift এবং Meta) ইন্টারসেপ্ট করতে dispatchKeyShortcutEvent() প্রয়োগ করে শর্টকাট চালু করা যেতে পারে। নির্দিষ্ট কোনও পরিবর্তক কী চেক করতে, এটি ব্যবহার করুন:

Kotlin

override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
  return when (event.keyCode) {
    KeyEvent.KEYCODE_O -> {
      openFile() // Ctrl+O, Shift+O, Alt+O
      true
    }
    KeyEvent.KEYCODE_Z-> {
      if (event.isCtrlPressed) {
        if (event.isShiftPressed) {
          redoLastAction() // Ctrl+Shift+Z pressed
          true
        } else {
          undoLastAction() // Ctrl+Z pressed
          true
        }
      }
    }
    else -> {
      return super.dispatchKeyShortcutEvent(event)
    }
  }
}

জাভা

@Override
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_O) {
      openFile(); // Ctrl+O, Shift+O, Alt+O
      return true;
  } else if(event.getKeyCode() == KeyEvent.KEYCODE_Z) {
      if (event.isCtrlPressed()) {
          if (event.isShiftPressed()) {
              redoLastAction();
              return true;
          }
          else {
              undoLastAction();
              return true;
          }
      }
  }
  return super.dispatchKeyShortcutEvent(event);
}

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

তবে, আপনি onKeyUp()-এ শর্টকাট প্রয়োগ করতে পারেন, এর জন্য KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), অথবা KeyEvent.isAltPressed() চেক করুন। পরিবর্তিত 'কী' আচরণ যদি শর্টকাটের চেয়ে অ্যাপের আচরণে বেশি পরিবর্তন হয়, তাহলে এটি ম্যানেজ করা সহজ হতে পারে। যেমন, গেমে W মানে "সামনে হাঁটা" এবং Shift+W মানে "সামনে দৌড়ানো"।

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_W-> {
      if (event.isShiftPressed) {
        if (event.isCtrlPressed) {
          flyForward() // Ctrl+Shift+W pressed
          true
        } else {
          runForward() // Shift+W pressed
          true
        }
      } else {
        walkForward() // W pressed
        true
      }
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

জাভা

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_W) {
        if (event.isShiftPressed()) {
            if (event.isCtrlPressed()) {
                flyForward(); // Ctrl+Shift+W pressed
                return true;
            } else {
                runForward(); // Shift+W pressed
                return true;
            }
        } else {
            walkForward();
            return true;
        }
    }
    return super.onKeyUp(keyCode, event);
}

এছাড়াও, কীবোর্ড শর্টকাট হেল্পার দেখুন।

স্টাইলাস

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

View#onTouchEvent() বা View#onGenericMotionEvent()-এর মাধ্যমে স্টাইলাস ইভেন্টকে টাচস্ক্রিন ইভেন্ট হিসেবে রিপোর্ট করা হয় এবং এতে SOURCE_STYLUS ধরনের MotionEvent#getSource() থাকে।

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 রেজিস্টার করতে হবে:

Kotlin

yourView.setOnContextClickListener {
    showContextMenu()
    true
}

জাভা

yourView.setOnContextClickListener(v -> {
    showContextMenu();
    return true;
});

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

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

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

Kotlin

// Change the icon to a "hand" pointer on hover.
// Highlight the view by changing the background.
yourView.setOnHoverListener { view, _ ->
    addVisualHighlighting(true)
    view.pointerIcon =
        PointerIcon.getSystemIcon(view.context, PointerIcon.TYPE_HAND)
    true // Listener consumes the event.
}

জাভা

// Change the icon to a "hand" pointer on hover.
// Highlight the view by changing the background.
yourView.setOnHoverListener((view, event) -> {
    addVisualHighlighting(true);
    view.setPointerIcon(
        PointerIcon.getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND)
    );
    return true; // Listener consumes the event.
});

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

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

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

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

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

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

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

  • অ্যাপের বাইরে থেকে টেনে আনা আইটেম অ্যাক্সেস করতে requestDragAndDropPermissions()-এর সাথে অনুমতির অনুরোধ করতে ভুলবেন না
  • অন্য অ্যাপ্লিকেশনে টেনে নিয়ে যাওয়ার জন্য আইটেমে অবশ্যই View.DRAG_FLAG_GLOBAL ফ্ল্যাগ থাকতে হবে

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

যেসব অ্যাপ মাউস ও টাচপ্যাড ইনপুট উন্নতভাবে ম্যানেজ করে, সেগুলির ক্ষেত্রে PointerEvent পেতে View#onGenericMotionEvent() এবং SOURCE_MOUSE ও SOURCE_TOUCHSCREEN-এর মধ্যে পার্থক্য করতে [MotionEvent.getSource()][] ব্যবহার করুন।

প্রয়োজনীয় আচরণ প্রয়োগ করতে MotionEvent অবজেক্ট পরীক্ষা করুন:

  • মুভমেন্টের ফলে ACTION_HOVER_MOVEটি ইভেন্ট তৈরি হয়।
  • বোতাম ACTION_BUTTON_PRESS এবং ACTION_BUTTON_RELEASE ইভেন্ট জেনারেট করে। এছাড়াও, আপনি getButtonState() ব্যবহার করে সব মাউস ও ট্র্যাকপ্যাড বোতামের বর্তমান অবস্থা চেক করতে পারবেন।
  • মাউস হুইল স্ক্রল করলে ACTION_SCROLLটি ইভেন্ট তৈরি হয়।

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

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

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

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

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

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

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

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