বড় স্ক্রিনের ডিভাইসগুলিতে, ব্যবহারকারীরা প্রায়শই কিবোর্ড, মাউস, ট্র্যাকপ্যাড, স্টাইলাস বা গেমপ্যাড ব্যবহার করে অ্যাপের সাথে ইন্টারঅ্যাক্ট করেন। আপনার অ্যাপকে বাহ্যিক ডিভাইস থেকে ইনপুট গ্রহণ করার উপযোগী করতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:
- বেসিক কিবোর্ড সাপোর্ট পরীক্ষা করুন , যেমন আনডু করার জন্য Ctrl+Z , কপি করার জন্য Ctrl+C , এবং সেভ করার জন্য Ctrl+S । ডিফল্ট কিবোর্ড শর্টকাটগুলোর তালিকার জন্য ‘হ্যান্ডেল কিবোর্ড অ্যাকশনস’ দেখুন।
- উন্নত কিবোর্ড সাপোর্ট পরীক্ষা করে দেখুন , যেমন— ট্যাব কী ও অ্যারো কী দিয়ে কিবোর্ড নেভিগেশন, এন্টার কী দিয়ে টেক্সট এন্ট্রি কনফার্মেশন এবং মিডিয়া অ্যাপে স্পেসবার দিয়ে প্লে ও পজ করা।
- কাস্টম কম্পোনেন্টগুলিতে কনটেক্সট মেনুর জন্য রাইট-ক্লিক, আইকনের উপর হোভার করলে তার পরিবর্তন এবং মাউস হুইল বা ট্র্যাকপ্যাড স্ক্রোল ইভেন্ট সহ মৌলিক মাউস ইন্টারঅ্যাকশনগুলি পরীক্ষা করুন ।
- অ্যাপ-নির্দিষ্ট ইনপুট ডিভাইস, যেমন স্টাইলাস, গেম কন্ট্রোলার এবং মিউজিক অ্যাপের MIDI কন্ট্রোলারগুলো পরীক্ষা করে দেখুন ।
- উন্নত ইনপুট সাপোর্টের কথা বিবেচনা করুন যা অ্যাপটিকে ডেস্কটপ পরিবেশে স্বতন্ত্র করে তুলতে পারে; যেমন, ডিজে অ্যাপের জন্য ক্রস-ফেডার হিসেবে টাচপ্যাড, গেমের জন্য মাউস ক্যাপচার, এবং কিবোর্ড-নির্ভর ব্যবহারকারীদের জন্য কিবোর্ড শর্টকাট।
কিবোর্ড
আপনার অ্যাপ যেভাবে কিবোর্ড ইনপুটে সাড়া দেয়, তা বড় স্ক্রিনের ইউজার এক্সপেরিয়েন্সে অবদান রাখে। কিবোর্ড ইনপুট তিন প্রকারের হয়: নেভিগেশন , কীস্ট্রোক এবং শর্টকাট ।
নেভিগেশন
টাচ-কেন্দ্রিক অ্যাপগুলিতে কিবোর্ড নেভিগেশন খুব কমই প্রয়োগ করা হয়, কিন্তু ব্যবহারকারীরা যখন কোনো অ্যাপ ব্যবহার করেন এবং তাদের হাত কিবোর্ডে থাকে, তখন তারা এটি আশা করেন। যাদের বিশেষ প্রয়োজন রয়েছে, তাদের জন্য ফোন, ট্যাবলেট, ফোল্ডেবল এবং ডেস্কটপ ডিভাইসে কিবোর্ড নেভিগেশন অপরিহার্য হতে পারে।
অনেক অ্যাপের ক্ষেত্রে, অ্যারো কী এবং ট্যাব কী নেভিগেশন অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়। উদাহরণস্বরূপ, কিছু কম্পোজেবল ডিফল্টরূপে ফোকাসযোগ্য হয়, যেমন একটি 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") }
আরও তথ্যের জন্য, ‘Making a composable focusable’ দেখুন।
যখন ফোকাস সক্রিয় করা হয়, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক সমস্ত ফোকাসযোগ্য কম্পোনেন্টের অবস্থানের উপর ভিত্তি করে একটি ন্যাভিগেশনাল ম্যাপিং তৈরি করে। এটি সাধারণত প্রত্যাশিতভাবেই কাজ করে এবং এর জন্য আর কোনো অতিরিক্ত উন্নয়নের প্রয়োজন হয় না।
তবে, ট্যাব এবং তালিকার মতো জটিল কম্পোজেবলগুলোর ক্ষেত্রে, কম্পোজ সবসময় ট্যাবযুক্ত নেভিগেশনের জন্য সঠিক পরবর্তী আইটেমটি নির্ধারণ করতে পারে না, উদাহরণস্বরূপ, যখন কম্পোজেবলগুলোর মধ্যে একটি হরাইজন্টাল স্ক্রলেবল হয় যা সম্পূর্ণরূপে দৃশ্যমান নয়।
ফোকাসের আচরণ নিয়ন্ত্রণ করতে, একাধিক কম্পোজেবলের একটি সংগ্রহের প্যারেন্ট কম্পোজেবলে 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বড় স্ক্রিনের ডিভাইসে অ্যাপগুলো কোনো অতিরিক্ত ডেভেলপমেন্টের কাজ ছাড়াই প্রত্যাশিতভাবে কাজ করবে। ফ্রেমওয়ার্ক যেসব কীস্ট্রোক আগে থেকে অনুমান করতে পারে না, সেগুলোর আচরণ অ্যাপগুলোকে নিজেদেরই সামলাতে হবে। কাস্টম ভিউযুক্ত অ্যাপগুলোর ক্ষেত্রে এটি বিশেষভাবে প্রযোজ্য।
এর কিছু উদাহরণ হলো চ্যাট অ্যাপ, যেখানে মেসেজ পাঠানোর জন্য এন্টার কী ব্যবহার করা হয়; মিডিয়া অ্যাপ, যেখানে স্পেসবার দিয়ে প্লেব্যাক শুরু ও বন্ধ করা হয়; এবং গেম, যেখানে 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()
)
আরও তথ্যের জন্য, নিম্নলিখিতগুলি দেখুন:
স্টাইলাস
অনেক বড় স্ক্রিনের ডিভাইসের সাথে একটি স্টাইলাস থাকে। অ্যান্ড্রয়েড অ্যাপগুলো স্টাইলাসকে টাচস্ক্রিন ইনপুট হিসেবে ব্যবহার করে। কিছু ডিভাইসে ইউএসবি বা ব্লুটুথ ড্রয়িং টেবিলও থাকতে পারে, যেমন ওয়াকম ইন্টুস (Wacom Intuos )। অ্যান্ড্রয়েড অ্যাপগুলো ব্লুটুথ ইনপুট গ্রহণ করতে পারলেও ইউএসবি ইনপুট নিতে পারে না।
স্টাইলাস 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 অবজেক্টটিতে ইভেন্ট সম্পর্কিত তথ্য থাকে:
- ডিসপ্লের সংস্পর্শে আসা টুলের উপর নির্ভর করে
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 রেজিস্টার করতে হবে:
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
},
)
}
কন্টেক্সট মেনু তৈরি করার বিস্তারিত বিবরণের জন্য, “একটি কন্টেক্সট মেনু তৈরি করুন” দেখুন।
হোভার
হোভার ইভেন্ট হ্যান্ডেল করার মাধ্যমে আপনি আপনার অ্যাপের লেআউটগুলোকে আরও পরিপাটি এবং ব্যবহারে সহজ করে তুলতে পারেন। কাস্টম লেআউটের ক্ষেত্রে এটি বিশেষভাবে প্রযোজ্য।উপাদানসমূহ:
এর দুটি সবচেয়ে সাধারণ উদাহরণ হলো:
- মাউস পয়েন্টার আইকন পরিবর্তন করার মাধ্যমে ব্যবহারকারীদেরকে জানানো যে কোনো এলিমেন্টের ইন্টারেক্টিভ বৈশিষ্ট্য আছে কিনা, যেমন সেটি ক্লিকযোগ্য বা সম্পাদনাযোগ্য।
- একটি বড় তালিকা বা গ্রিডের আইটেমগুলোর উপর পয়েন্টার ঘোরালে ভিজ্যুয়াল ফিডব্যাক যোগ করা।
ড্র্যাগ এবং ড্রপ
একাধিক উইন্ডোযুক্ত পরিবেশে, ব্যবহারকারীরা অ্যাপগুলোর মধ্যে আইটেম ড্র্যাগ ও ড্রপ করতে পারার প্রত্যাশা করেন। ডেস্কটপ ডিভাইসের পাশাপাশি স্প্লিট-স্ক্রিন মোডে থাকা ট্যাবলেট, ফোন এবং ফোল্ডেবল ডিভাইসের ক্ষেত্রেও এটি প্রযোজ্য।
ব্যবহারকারীরা আপনার অ্যাপে আইটেম টেনে আনার সম্ভাবনা আছে কিনা তা বিবেচনা করুন। উদাহরণস্বরূপ, ফটো এডিটরদের ফটো পাওয়ার প্রত্যাশা করা উচিত, অডিও প্লেয়ারদের অডিও ফাইল পাওয়ার প্রত্যাশা করা উচিত এবং ড্রয়িং প্রোগ্রামগুলোর ফটো পাওয়ার প্রত্যাশা করা উচিত।
ড্র্যাগ অ্যান্ড ড্রপ সমর্থন যোগ করতে, দেখুনড্র্যাগ এবং ড্রপএবং “Android on ChromeOS — Implementing Drag & Drop” ব্লগ পোস্টটি দেখুন।
ChromeOS-এর জন্য বিশেষ বিবেচ্য বিষয়সমূহ
- অ্যাপের বাইরে থেকে টেনে আনা আইটেমগুলো অ্যাক্সেস করার জন্য
requestDragAndDropPermissions()ব্যবহার করে অনুমতি চাইতে মনে রাখবেন। অন্য অ্যাপ্লিকেশনে টেনে নিয়ে যাওয়ার জন্য কোনো আইটেমে অবশ্যই
View.DRAG_FLAG_GLOBALফ্ল্যাগটি থাকতে হবে।
উন্নত পয়েন্টার সমর্থন
যেসব অ্যাপ মাউস এবং টাচপ্যাড ইনপুটের উন্নত ব্যবস্থাপনা করে, তাদের একটি বাস্তবায়ন করা উচিত।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: পয়েন্টারের ক্রিয়াকলাপ, যেমন চাপ দেওয়া, সরানো, স্ক্রল করা এবং ছেড়ে দেওয়া।
গেম কন্ট্রোলার
কিছু বড় স্ক্রিনের অ্যান্ড্রয়েড ডিভাইস চারটি পর্যন্ত গেম কন্ট্রোলার সাপোর্ট করে। গেম কন্ট্রোলারগুলো পরিচালনা করতে স্ট্যান্ডার্ড অ্যান্ড্রয়েড গেম কন্ট্রোলার এপিআই (API) ব্যবহার করুন (দেখুন ‘গেম কন্ট্রোলার সাপোর্ট ’)।
গেম কন্ট্রোলারের বাটনগুলো একটি সাধারণ ম্যাপিং অনুসরণ করে কিছু নির্দিষ্ট মানে ম্যাপ করা থাকে। কিন্তু সব গেম কন্ট্রোলার নির্মাতা একই ম্যাপিং রীতি অনুসরণ করে না। আপনি যদি ব্যবহারকারীদের বিভিন্ন জনপ্রিয় কন্ট্রোলার ম্যাপিং বেছে নেওয়ার সুযোগ দেন, তবে আরও ভালো অভিজ্ঞতা দিতে পারবেন। এ বিষয়ে আরও তথ্যের জন্য ‘গেমপ্যাড বাটন প্রেস প্রসেস করুন’ দেখুন।
ইনপুট অনুবাদ মোড
ChromeOS ডিফল্টরূপে একটি ইনপুট ট্রান্সলেশন মোড চালু করে। বেশিরভাগ অ্যান্ড্রয়েড অ্যাপের ক্ষেত্রে, এই মোডটি অ্যাপগুলোকে ডেস্কটপ পরিবেশে প্রত্যাশিতভাবে কাজ করতে সাহায্য করে। এর কিছু উদাহরণ হলো টাচপ্যাডে স্বয়ংক্রিয়ভাবে দুই-আঙুলের স্ক্রলিং ও মাউস হুইল স্ক্রলিং চালু করা এবং ডিসপ্লের মূল স্থানাঙ্ককে উইন্ডোর স্থানাঙ্কে রূপান্তর করা। সাধারণত, অ্যাপ ডেভেলপারদের নিজেদের এই আচরণগুলোর কোনোটিই প্রয়োগ করার প্রয়োজন হয় না।
যদি কোনো অ্যাপ কাস্টম ইনপুট আচরণ প্রয়োগ করে, যেমন একটি কাস্টম দুই-আঙুলের টাচপ্যাড পিঞ্চ অ্যাকশন সংজ্ঞায়িত করে, অথবা এই ইনপুট অনুবাদগুলি অ্যাপের প্রত্যাশিত ইনপুট ইভেন্টগুলি প্রদান না করে, তাহলে আপনি অ্যান্ড্রয়েড ম্যানিফেস্টে নিম্নলিখিত ট্যাগটি যোগ করে ইনপুট অনুবাদ মোড নিষ্ক্রিয় করতে পারেন:
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />