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

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

  • সাধারণ কীবোর্ড কাজ করে কিনা দেখুন, যেমন, আগের অবস্থায় ফেরানোর জন্য 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 অ্যাপ স্টাইলাসকে টাচস্ক্রিন ইনপুট হিসেবে হ্যান্ডেল করে। এছাড়াও, কিছু ডিভাইসে Wacom Intuos-এর মতো USB বা ব্লুটুথ ড্রয়িং টেবল থাকতে পারে। Android অ্যাপ Bluetooth ইনপুট গ্রহণ করতে পারে, কিন্তু 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 লেভেল 33) ও এর পরের যেকোনও ভার্সনে, সিস্টেম 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() এবং [MotionEvent.getSource()][] ব্যবহার করে SOURCE_MOUSE ও SOURCE_TOUCHSCREEN-এর মধ্যে পার্থক্য করুন।

প্রয়োজনীয় আচরণ প্রয়োগ করতে 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" />

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