বড় স্ক্রিনের ডিভাইসগুলিতে, ব্যবহারকারীরা প্রায়শই কিবোর্ড, মাউস, ট্র্যাকপ্যাড, স্টাইলাস বা গেমপ্যাড ব্যবহার করে অ্যাপের সাথে ইন্টারঅ্যাক্ট করেন। আপনার অ্যাপকে বাহ্যিক ডিভাইস থেকে ইনপুট গ্রহণ করার উপযোগী করতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:
- বেসিক কিবোর্ড সাপোর্ট পরীক্ষা করুন , যেমন আনডু করার জন্য Ctrl+Z , কপি করার জন্য Ctrl+C , এবং সেভ করার জন্য Ctrl+S । ডিফল্ট কিবোর্ড শর্টকাটগুলোর তালিকার জন্য ‘হ্যান্ডেল কিবোর্ড অ্যাকশনস’ দেখুন।
- উন্নত কিবোর্ড সাপোর্ট পরীক্ষা করে দেখুন , যেমন— ট্যাব কী ও অ্যারো কী দিয়ে কিবোর্ড নেভিগেশন, এন্টার কী দিয়ে টেক্সট এন্ট্রি কনফার্মেশন এবং মিডিয়া অ্যাপে স্পেসবার দিয়ে প্লে ও পজ করা।
- কাস্টম কম্পোনেন্টগুলিতে কনটেক্সট মেনুর জন্য রাইট-ক্লিক, আইকনের উপর হোভার করলে তার পরিবর্তন এবং মাউস হুইল বা ট্র্যাকপ্যাড স্ক্রোল ইভেন্ট সহ মৌলিক মাউস ইন্টারঅ্যাকশনগুলি পরীক্ষা করুন ।
- অ্যাপ-নির্দিষ্ট ইনপুট ডিভাইস, যেমন স্টাইলাস, গেম কন্ট্রোলার এবং মিউজিক অ্যাপের MIDI কন্ট্রোলারগুলো পরীক্ষা করে দেখুন ।
- উন্নত ইনপুট সাপোর্টের কথা বিবেচনা করুন যা অ্যাপটিকে ডেস্কটপ পরিবেশে স্বতন্ত্র করে তুলতে পারে; যেমন, ডিজে অ্যাপের জন্য ক্রস-ফেডার হিসেবে টাচপ্যাড, গেমের জন্য মাউস ক্যাপচার, এবং কিবোর্ড-নির্ভর ব্যবহারকারীদের জন্য কিবোর্ড শর্টকাট।
কিবোর্ড
আপনার অ্যাপ যেভাবে কিবোর্ড ইনপুটে সাড়া দেয়, তা বড় স্ক্রিনের ইউজার এক্সপেরিয়েন্সে অবদান রাখে। কিবোর্ড ইনপুট তিন প্রকারের হয়: নেভিগেশন , কীস্ট্রোক এবং শর্টকাট ।
নেভিগেশন
টাচ-কেন্দ্রিক অ্যাপগুলিতে কিবোর্ড নেভিগেশন খুব কমই প্রয়োগ করা হয়, কিন্তু ব্যবহারকারীরা যখন কোনো অ্যাপ ব্যবহার করেন এবং তাদের হাত কিবোর্ডে থাকে, তখন তারা এটি আশা করেন। যাদের বিশেষ প্রয়োজন রয়েছে, তাদের জন্য ফোন, ট্যাবলেট, ফোল্ডেবল এবং ডেস্কটপ ডিভাইসে কিবোর্ড নেভিগেশন অপরিহার্য হতে পারে।
অনেক অ্যাপের ক্ষেত্রে, অ্যারো কী এবং ট্যাব নেভিগেশন অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়। উদাহরণস্বরূপ, একটি Button ডিফল্টরূপে ফোকাসযোগ্য থাকে, এবং কিবোর্ড নেভিগেশন সাধারণত কোনো অতিরিক্ত কোড ছাড়াই কাজ করা উচিত। যে ভিউগুলো ডিফল্টরূপে ফোকাসযোগ্য নয়, সেগুলোর জন্য কিবোর্ড নেভিগেশন সক্রিয় করতে, সেগুলোকে ফোকাসযোগ্য হিসেবে চিহ্নিত করুন, যা প্রোগ্রাম্যাটিকভাবে বা XML-এ করা যেতে পারে:
কোটলিন
yourView.isFocusable = true
জাভা
yourView.setFocusable(true);
বিকল্পভাবে আপনি আপনার লেআউট ফাইলে focusable অ্যাট্রিবিউট সেট করতে পারেন:
android:focusable="true"
আরও জানতে, ফোকাস হ্যান্ডলিং দেখুন।
যখন ফোকাস সক্রিয় করা হয়, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক সমস্ত ফোকাসযোগ্য ভিউগুলির অবস্থানের উপর ভিত্তি করে একটি ন্যাভিগেশনাল ম্যাপিং তৈরি করে। এটি সাধারণত প্রত্যাশিতভাবেই কাজ করে এবং এর জন্য আর কোনো অতিরিক্ত উন্নয়নের প্রয়োজন হয় না। যখন ডিফল্ট ম্যাপিংটি কোনো অ্যাপের প্রয়োজনের জন্য সঠিক হয় না, তখন ম্যাপিংটি নিম্নোক্তভাবে ওভাররাইড করা যেতে পারে:
কোটলিন
// 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বড় স্ক্রিনের ডিভাইসে অ্যাপগুলো কোনো অতিরিক্ত ডেভেলপমেন্টের কাজ ছাড়াই প্রত্যাশিতভাবে কাজ করবে। ফ্রেমওয়ার্ক যেসব কীস্ট্রোক আগে থেকে অনুমান করতে পারে না, সেগুলোর আচরণ অ্যাপগুলোকে নিজেদেরই সামলাতে হবে। কাস্টম ভিউযুক্ত অ্যাপগুলোর ক্ষেত্রে এটি বিশেষভাবে প্রযোজ্য।
এর কিছু উদাহরণ হলো চ্যাট অ্যাপ, যেখানে মেসেজ পাঠানোর জন্য এন্টার কী ব্যবহার করা হয়; মিডিয়া অ্যাপ, যেখানে স্পেসবার দিয়ে প্লেব্যাক শুরু ও বন্ধ করা হয়; এবং গেম, যেখানে w , a , s ও d কী দিয়ে নড়াচড়া নিয়ন্ত্রণ করা হয়।
বেশিরভাগ অ্যাপই 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)
}
}
জাভা
@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() ইমপ্লিমেন্ট করার মাধ্যমে শর্টকাট সক্রিয় করা যায়। একটি নির্দিষ্ট মডিফায়ার কী চেক করতে, ব্যবহার করুন:
-
KeyEvent.isCtrlPressed(), -
KeyEvent.isShiftPressed(), -
KeyEvent.isAltPressed(), -
KeyEvent.isMetaPressed(), অথবা
কোটলিন
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 মানে "সামনে দৌড়ানো"।
কোটলিন
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);
}
আরও দেখুন কীবোর্ড শর্টকাট সহায়ক ।
স্টাইলাস
অনেক বড় স্ক্রিনের ডিভাইসের সাথে একটি স্টাইলাস থাকে। অ্যান্ড্রয়েড অ্যাপগুলো স্টাইলাসকে টাচস্ক্রিন ইনপুট হিসেবে ব্যবহার করে। কিছু ডিভাইসে ইউএসবি বা ব্লুটুথ ড্রয়িং টেবিলও থাকতে পারে, যেমন ওয়াকম ইন্টুস (Wacom Intuos )। অ্যান্ড্রয়েড অ্যাপগুলো ব্লুটুথ ইনপুট গ্রহণ করতে পারলেও ইউএসবি ইনপুট নিতে পারে না।
একটি স্টাইলাস ইভেন্টকে View#onTouchEvent() বা View#onGenericMotionEvent() দ্বারা একটি টাচস্ক্রিন ইভেন্ট হিসেবে রিপোর্ট করা হয় এবং এতে SOURCE_STYLUS টাইপের একটি MotionEvent#getSource() থাকে।
MotionEvent অবজেক্টটিতে ইভেন্ট সম্পর্কিত তথ্য থাকে:
- ডিসপ্লের সংস্পর্শে আসা টুলের উপর নির্ভর করে
MotionEvent#getToolType()TOOL_TYPE_FINGER,TOOL_TYPE_STYLUS, বাTOOL_TYPE_ERASERরিটার্ন করে। -
MotionEvent#getPressure()স্টাইলাস পেনের উপর প্রয়োগ করা ভৌত চাপ রিপোর্ট করে (যদি সমর্থিত হয়)। -
MotionEvent.AXIS_TILTএবংMotionEvent.AXIS_ORIENTATIONসাথেMotionEvent#getAxisValue()স্টাইলাসের ভৌত টিল্ট এবং ওরিয়েন্টেশন প্রদান করে (যদি সমর্থিত হয়)।
ঐতিহাসিক বিষয়
অ্যান্ড্রয়েড ইনপুট ইভেন্টগুলোকে ব্যাচ করে এবং প্রতি ফ্রেমে একবার করে সেগুলো সরবরাহ করে। একটি স্টাইলাস ডিসপ্লের তুলনায় অনেক বেশি ফ্রিকোয়েন্সিতে ইভেন্ট রিপোর্ট করতে পারে। ড্রয়িং অ্যাপ তৈরি করার সময়, getHistorical API ব্যবহার করে সাম্প্রতিক অতীতের ইভেন্টগুলো পরীক্ষা করে দেখুন:
-
MotionEvent#getHistoricalX() -
MotionEvent#getHistoricalY() -
MotionEvent#getHistoricalPressure() -
MotionEvent#getHistoricalAxisValue()
হাতের তালু প্রত্যাখ্যান
ব্যবহারকারীরা যখন স্টাইলাস ব্যবহার করে আপনার অ্যাপে আঁকেন, লেখেন বা ইন্টারঅ্যাক্ট করেন, তখন তারা মাঝে মাঝে হাতের তালু দিয়ে স্ক্রিন স্পর্শ করেন। সিস্টেম এই অনিচ্ছাকৃত তালুর স্পর্শটি শনাক্ত করে উপেক্ষা করার আগেই টাচ ইভেন্টটি (যা ACTION_DOWN বা ACTION_POINTER_DOWN এ সেট করা থাকে) আপনার অ্যাপে রিপোর্ট করা যেতে পারে।
অ্যান্ড্রয়েড একটি MotionEvent ডিসপ্যাচ করার মাধ্যমে পাম টাচ ইভেন্ট বাতিল করে। যদি আপনার অ্যাপ ACTION_CANCEL পায়, তাহলে জেসচারটি বাতিল করুন। যদি আপনার অ্যাপ ACTION_POINTER_UP পায়, তাহলে FLAG_CANCELED সেট করা আছে কিনা তা পরীক্ষা করুন। যদি থাকে, তাহলে জেসচারটি বাতিল করুন।
শুধু FLAG_CANCELED চেক করবেন না। Android 13 (API লেভেল 33) এবং এর উপরের সংস্করণগুলিতে, সিস্টেম ACTION_CANCEL ইভেন্টের জন্য FLAG_CANCELED সেট করে, কিন্তু এর নিচের Android সংস্করণগুলিতে সিস্টেম এই ফ্ল্যাগটি সেট করে না।
অ্যান্ড্রয়েড ১২
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩২) এবং এর নিচের সংস্করণগুলোতে, পাম রিজেকশন শনাক্তকরণ শুধুমাত্র একক-পয়েন্টার টাচ ইভেন্টের ক্ষেত্রেই সম্ভব। যদি পাম টাচই একমাত্র পয়েন্টার হয়, তবে সিস্টেম মোশন ইভেন্ট অবজেক্টে ACTION_CANCEL সেট করে ইভেন্টটি বাতিল করে দেয়। যদি অন্যান্য পয়েন্টারগুলোও নিচে থাকে, তবে সিস্টেম ACTION_POINTER_UP সেট করে, যা পাম রিজেকশন শনাক্ত করার জন্য যথেষ্ট নয়।
অ্যান্ড্রয়েড ১৩
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এবং এর পরবর্তী সংস্করণগুলোতে, যদি পাম টাচই একমাত্র পয়েন্টার হয়, তাহলে সিস্টেম মোশন ইভেন্ট অবজেক্টে 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>
যখন কোনো অ্যাপ সিস্টেমে নিবন্ধিত হয়, তখন ব্যবহারকারী সেটিকে ডিফল্ট নোট-নেওয়ার অ্যাপ হিসেবে নির্বাচন করতে পারেন। যখন একটি নতুন নোটের অনুরোধ করা হয়, তখন অ্যাপটি স্টাইলাস ইনপুটের জন্য প্রস্তুত একটি খালি নোট তৈরি করবে। যখন ব্যবহারকারী কোনো ছবিতে (যেমন স্ক্রিনশট বা ডাউনলোড করা ছবি) টীকা যোগ করতে চান, তখন অ্যাপটি content:// ' URI সহ এক বা একাধিক আইটেম সম্বলিত ClipData নিয়ে চালু হয়। অ্যাপটি প্রথম সংযুক্ত ছবিটিকে ব্যাকগ্রাউন্ড ইমেজ হিসেবে ব্যবহার করে একটি নোট তৈরি করবে এবং এমন একটি মোডে প্রবেশ করবে যেখানে ব্যবহারকারী স্টাইলাস দিয়ে স্ক্রিনে আঁকতে পারবেন।
স্টাইলাস ছাড়া নোট নেওয়ার উদ্দেশ্য পরীক্ষা করুন
সক্রিয় স্টাইলাস ছাড়া কোনো অ্যাপ নোট নেওয়ার অনুরোধে সঠিকভাবে সাড়া দেয় কিনা তা পরীক্ষা করতে, ChromeOS-এ নোট নেওয়ার বিকল্পগুলো প্রদর্শন করার জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:
- ডেভ মোডে স্যুইচ করুন এবং ডিভাইসটিকে রাইটেবল করুন।
- টার্মিনাল খুলতে Ctrl+Alt+F2 চাপুন।
-
sudo vi /etc/chrome_dev.confকমান্ডটি চালান। - সম্পাদনা করতে
iচাপুন এবং ফাইলের শেষে একটি নতুন লাইনে--ash-enable-paletteযোগ করুন। - সংরক্ষণ করতে Esc চাপুন এবং তারপর : , w , q টাইপ করে Enter চাপুন।
- সাধারণ ChromeOS UI-তে ফিরে যেতে Ctrl+Alt+F1 চাপুন।
- লগ আউট করুন, তারপর আবার লগ ইন করুন।
এখন শেলফে একটি স্টাইলাস মেনু থাকা উচিত:
- শেলফে থাকা স্টাইলাস বাটনটি ট্যাপ করুন এবং 'New note' বেছে নিন। এতে একটি খালি ড্রয়িং নোট খুলে যাবে।
- একটি স্ক্রিনশট নিন। শেলফ থেকে, স্টাইলাস বাটন > ক্যাপচার স্ক্রিন অথবা একটি ছবি ডাউনলোড করুন নির্বাচন করুন। নোটিফিকেশনে ছবিতে টীকা যোগ করার (Annotate image ) একটি অপশন থাকা উচিত। এটি অ্যাপটি চালু করবে এবং ছবিটি টীকা যোগ করার জন্য প্রস্তুত থাকবে।
মাউস এবং টাচপ্যাড সমর্থন
বেশিরভাগ অ্যাপকে সাধারণত বড় স্ক্রিন-কেন্দ্রিক মাত্র তিনটি ইভেন্ট পরিচালনা করতে হয়: রাইট-ক্লিক , হোভার এবং ড্র্যাগ অ্যান্ড ড্রপ ।
ডান-ক্লিক
যেসব কাজের ফলে অ্যাপে কনটেক্সট মেনু দেখানো হয়, যেমন তালিকার কোনো আইটেমে টাচ করে ধরে রাখা, সেগুলোর ক্ষেত্রেও রাইট-ক্লিক ইভেন্টের প্রতিক্রিয়া হওয়া উচিত।
রাইট-ক্লিক ইভেন্টগুলি পরিচালনা করার জন্য, অ্যাপগুলিকে একটি View.OnContextClickListener রেজিস্টার করতে হবে:
কোটলিন
yourView.setOnContextClickListener {
showContextMenu()
true
}
জাভা
yourView.setOnContextClickListener(v -> {
showContextMenu();
return true;
});
কন্টেক্সট মেনু তৈরি করার বিস্তারিত বিবরণের জন্য, “একটি কন্টেক্সট মেনু তৈরি করুন” দেখুন।
হোভার
হোভার ইভেন্ট হ্যান্ডেল করার মাধ্যমে আপনি আপনার অ্যাপের লেআউটগুলোকে আরও পরিপাটি এবং ব্যবহারে সহজ করে তুলতে পারেন। কাস্টম লেআউটের ক্ষেত্রে এটি বিশেষভাবে প্রযোজ্য।মতামত:
কোটলিন
// 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.
});
এর দুটি সবচেয়ে সাধারণ উদাহরণ হলো:
- মাউস পয়েন্টার আইকন পরিবর্তন করার মাধ্যমে ব্যবহারকারীদেরকে জানানো যে কোনো এলিমেন্টের ইন্টারেক্টিভ বৈশিষ্ট্য আছে কিনা, যেমন সেটি ক্লিকযোগ্য বা সম্পাদনাযোগ্য।
- একটি বড় তালিকা বা গ্রিডের আইটেমগুলোর উপর পয়েন্টার ঘোরালে ভিজ্যুয়াল ফিডব্যাক যোগ করা।
ড্র্যাগ এবং ড্রপ
একাধিক উইন্ডোযুক্ত পরিবেশে, ব্যবহারকারীরা অ্যাপগুলোর মধ্যে আইটেম ড্র্যাগ ও ড্রপ করতে পারার প্রত্যাশা করেন। ডেস্কটপ ডিভাইসের পাশাপাশি স্প্লিট-স্ক্রিন মোডে থাকা ট্যাবলেট, ফোন এবং ফোল্ডেবল ডিভাইসের ক্ষেত্রেও এটি প্রযোজ্য।
ব্যবহারকারীরা আপনার অ্যাপে আইটেম টেনে আনার সম্ভাবনা আছে কিনা তা বিবেচনা করুন। উদাহরণস্বরূপ, ফটো এডিটরদের ফটো পাওয়ার প্রত্যাশা করা উচিত, অডিও প্লেয়ারদের অডিও ফাইল পাওয়ার প্রত্যাশা করা উচিত এবং ড্রয়িং প্রোগ্রামগুলোর ফটো পাওয়ার প্রত্যাশা করা উচিত।
ড্র্যাগ অ্যান্ড ড্রপ সমর্থন যোগ করতে, দেখুনড্র্যাগ অ্যান্ড ড্রপ সক্ষম করুনএবং “Android on ChromeOS — Implementing Drag & Drop” ব্লগ পোস্টটি দেখুন।
ChromeOS-এর জন্য বিশেষ বিবেচ্য বিষয়সমূহ
- অ্যাপের বাইরে থেকে টেনে আনা আইটেমগুলো অ্যাক্সেস করার জন্য
requestDragAndDropPermissions()ব্যবহার করে অনুমতি চাইতে মনে রাখবেন। অন্য অ্যাপ্লিকেশনে টেনে নিয়ে যাওয়ার জন্য কোনো আইটেমে অবশ্যই
View.DRAG_FLAG_GLOBALফ্ল্যাগটি থাকতে হবে।
উন্নত পয়েন্টার সমর্থন
যেসব অ্যাপ মাউস এবং টাচপ্যাড ইনপুটের উন্নত ব্যবস্থাপনা করে, তাদের একটি বাস্তবায়ন করা উচিত।SOURCE_MOUSE এবং SOURCE_TOUCHSCREEN মধ্যে পার্থক্য করার জন্য View#onGenericMotionEvent() এবং [ MotionEvent.getSource() ][] ব্যবহার করুন।
প্রয়োজনীয় আচরণ বাস্তবায়ন করতে MotionEvent অবজেক্টটি পরীক্ষা করুন:
- চলাচল
ACTION_HOVER_MOVEইভেন্ট তৈরি করে। - বাটনগুলো
ACTION_BUTTON_PRESSএবংACTION_BUTTON_RELEASEইভেন্ট তৈরি করে। এছাড়াও আপনিgetButtonState()ব্যবহার করে মাউস এবং ট্র্যাকপ্যাডের সমস্ত বাটনের বর্তমান অবস্থা পরীক্ষা করতে পারেন। - মাউস হুইল স্ক্রোলিং
ACTION_SCROLLইভেন্ট তৈরি করে।
গেম কন্ট্রোলার
কিছু বড় স্ক্রিনের অ্যান্ড্রয়েড ডিভাইস চারটি পর্যন্ত গেম কন্ট্রোলার সাপোর্ট করে। গেম কন্ট্রোলারগুলো পরিচালনা করতে স্ট্যান্ডার্ড অ্যান্ড্রয়েড গেম কন্ট্রোলার এপিআই (API) ব্যবহার করুন (দেখুন ‘গেম কন্ট্রোলার সাপোর্ট ’)।
গেম কন্ট্রোলারের বাটনগুলো একটি সাধারণ ম্যাপিং অনুসরণ করে কিছু নির্দিষ্ট মানে ম্যাপ করা থাকে। কিন্তু সব গেম কন্ট্রোলার নির্মাতা একই ম্যাপিং রীতি অনুসরণ করে না। আপনি যদি ব্যবহারকারীদের বিভিন্ন জনপ্রিয় কন্ট্রোলার ম্যাপিং বেছে নেওয়ার সুযোগ দেন, তবে আরও ভালো অভিজ্ঞতা দিতে পারবেন। এ বিষয়ে আরও তথ্যের জন্য ‘গেমপ্যাড বাটন প্রেস প্রসেস করুন’ দেখুন।
ইনপুট অনুবাদ মোড
ChromeOS ডিফল্টরূপে একটি ইনপুট ট্রান্সলেশন মোড চালু করে। বেশিরভাগ অ্যান্ড্রয়েড অ্যাপের ক্ষেত্রে, এই মোডটি অ্যাপগুলোকে ডেস্কটপ পরিবেশে প্রত্যাশিতভাবে কাজ করতে সাহায্য করে। এর কিছু উদাহরণ হলো টাচপ্যাডে স্বয়ংক্রিয়ভাবে দুই-আঙুলের স্ক্রলিং ও মাউস হুইল স্ক্রলিং চালু করা এবং ডিসপ্লের মূল স্থানাঙ্ককে উইন্ডোর স্থানাঙ্কে রূপান্তর করা। সাধারণত, অ্যাপ ডেভেলপারদের নিজেদের এই আচরণগুলোর কোনোটিই প্রয়োগ করার প্রয়োজন হয় না।
যদি কোনো অ্যাপ কাস্টম ইনপুট আচরণ প্রয়োগ করে, যেমন একটি কাস্টম দুই-আঙুলের টাচপ্যাড পিঞ্চ অ্যাকশন সংজ্ঞায়িত করে, অথবা এই ইনপুট অনুবাদগুলি অ্যাপের প্রত্যাশিত ইনপুট ইভেন্টগুলি প্রদান না করে, তাহলে আপনি অ্যান্ড্রয়েড ম্যানিফেস্টে নিম্নলিখিত ট্যাগটি যোগ করে ইনপুট অনুবাদ মোড নিষ্ক্রিয় করতে পারেন:
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />