বড় স্ক্রিন ডিভাইসে, ব্যবহারকারীরা প্রায়ই কীবোর্ড, মাউস, ট্র্যাকপ্যাড, স্টাইলাস বা গেমপ্যাড ব্যবহার করে অ্যাপের সাথে ইন্টার্যাক্ট করেন। এক্সটার্নাল ডিভাইস থেকে ইনপুট গ্রহণ করার জন্য আপনার অ্যাপ চালু করতে, নিম্নলিখিত কাজগুলি করুন:
- সাধারণ কীবোর্ড কাজ করে কিনা দেখুন, যেমন, আগের অবস্থায় ফেরানোর জন্য Ctrl+Z, কপি করার জন্য Ctrl+C এবং সেভ করার জন্য Ctrl+S। ডিফল্ট কীবোর্ড শর্টকাটের তালিকা পেতে কীবোর্ড অ্যাকশন ম্যানেজ করা দেখুন।
- উন্নত কীবোর্ড সাপোর্ট পরীক্ষা করুন, যেমন, Tab কী এবং তীরচিহ্ন কী কীবোর্ড নেভিগেশন, Enter কী টেক্সট এন্ট্রি কনফার্মেশন, এবং মিডিয়া অ্যাপে Spacebar প্লে ও পজ করা।
- মাউসের প্রাথমিক ইন্টার্যাকশন পরীক্ষা করুন, যার মধ্যে রয়েছে কনটেক্সট মেনুর জন্য ডানদিকের বোতামে ক্লিক করা, হোভার করলে আইকনের পরিবর্তন এবং কাস্টম কম্পোনেন্টে মাউস হুইল বা ট্র্যাকপ্যাড স্ক্রল ইভেন্ট।
- স্টাইলাস, গেম কন্ট্রোলার এবং মিউজিক অ্যাপ MIDI কন্ট্রোলারের মতো অ্যাপ-নির্দিষ্ট ইনপুট ডিভাইস পরীক্ষা করুন।
- উন্নত ইনপুট সাপোর্ট বিবেচনা করুন যা ডেস্কটপ এনভায়রনমেন্টে অ্যাপটিকে আলাদা করে তুলতে পারে। যেমন, DJ অ্যাপের জন্য ক্রস‑ফেডার হিসেবে টাচপ্যাড, গেমের জন্য মাউস ক্যাপচার এবং কীবোর্ড‑কেন্দ্রিক ব্যবহারকারীদের জন্য কীবোর্ড শর্টকাট।
কীবোর্ড
কীবোর্ড ইনপুটের ক্ষেত্রে আপনার অ্যাপ যেভাবে প্রতিক্রিয়া জানায়, তা বড় স্ক্রিনে ব্যবহারকারীর অভিজ্ঞতায় অবদান রাখে। তিন ধরনের কীবোর্ড ইনপুট আছে: নেভিগেশন, কীস্ট্রোক এবং শর্টকাট।
নেভিগেশন
টাচ‑কেন্দ্রিক অ্যাপে কীবোর্ড নেভিগেশন খুব কমই প্রয়োগ করা হয়, কিন্তু ব্যবহারকারীরা অ্যাপ ব্যবহার করার সময় এবং তাদের হাতে কীবোর্ড থাকলে এটি আশা করেন। অ্যাক্সেসিবিলিটি সংক্রান্ত প্রয়োজনীয়তা আছে এমন ব্যবহারকারীদের জন্য ফোন, ট্যাবলেট, ফোল্ডেবল ও ডেস্কটপ ডিভাইসে কীবোর্ড নেভিগেশন অত্যন্ত গুরুত্বপূর্ণ হতে পারে।
অনেক অ্যাপের ক্ষেত্রে, তীরচিহ্ন কী এবং Tab কী নেভিগেশন 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 অ্যাপ স্টাইলাসকে টাচস্ক্রিন ইনপুট হিসেবে হ্যান্ডেল করে। এছাড়াও, কিছু ডিভাইসে Wacom Intuos-এর মতো USB বা ব্লুটুথ ড্রয়িং টেবল থাকতে পারে। Android অ্যাপ Bluetooth ইনপুট গ্রহণ করতে পারে, কিন্তু 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 অবজেক্টে ইভেন্ট সম্পর্কিত তথ্য থাকে:
MotionEvent#getToolType()TOOL_TYPE_FINGER,TOOL_TYPE_STYLUS, অথবাTOOL_TYPE_ERASERউত্তর দেয়, এটি নির্ভর করে সেই টুলের উপর যেটি ডিসপ্লের সাথে যোগাযোগ করেছেMotionEvent#getPressure()স্টাইলাস পেনে (কাজ করলে) প্রয়োগ করা ফিজিক্যাল প্রেসার সম্পর্কে রিপোর্ট করেMotionEvent.AXIS_TILTওMotionEvent.AXIS_ORIENTATION-এর সাথেMotionEvent#getAxisValue()স্টাইলাসকে ফিজিক্যালি কাত ও ওরিয়েন্ট করার সুবিধা দেয় (যদি কাজ করে)
ঐতিহাসিক পয়েন্ট
Android ইনপুট ইভেন্ট ব্যাচ করে এবং প্রতি ফ্রেমে একবার করে ডেলিভার করে। ডিসপ্লের তুলনায় অনেক বেশি ফ্রিকোয়েন্সিতে স্টাইলাস
ইভেন্ট রিপোর্ট করতে পারে। ড্রয়িং
অ্যাপ তৈরি করার সময়, সাম্প্রতিক অতীতে ঘটে থাকতে পারে এমন ইভেন্ট চেক করতে
getHistorical API ব্যবহার করুন:
MotionEvent#getHistoricalX()MotionEvent#getHistoricalY()MotionEvent#getHistoricalPressure()MotionEvent#getHistoricalAxisValue()
পাম রিজেকশন
ব্যবহারকারীরা স্টাইলাস ব্যবহার করে আপনার অ্যাপে আঁকতে, লিখতে বা ইন্টার্যাক্ট করতে গেলে, কখনও কখনও
তাদের হাতের তালু দিয়ে স্ক্রিন স্পর্শ করে ফেলেন। সিস্টেমের শনাক্ত করার আগে এবং অনিচ্ছাকৃত পাম টাচ উপেক্ষা করার আগে, আপনার অ্যাপে টাচ ইভেন্ট (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-এ নোট নেওয়ার বিকল্প দেখাতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:
- ডেভেলপার মোডে পাল্টে ডিভাইসটি রাইটেবল করুন
- টার্মিনাল খুলতে Ctrl+Alt+F2 প্রেস করুন
- কমান্ড রান করান
sudo vi /etc/chrome_dev.conf - ফাইল এডিট করতে
iএবং ফাইলের শেষে নতুন লাইন যোগ করতে--ash-enable-paletteপ্রেস করুন - Esc টিপে সেভ করুন এবং তারপরে :, w, q টাইপ করে Enter টিপুন
- সাধারণ ChromeOS UI-তে ফিরে যেতে Ctrl+Alt+F1 প্রেস করুন
- লগ-আউট করে আবার লগ-ইন করুন
এখন শেল্ফে একটি স্টাইলাস মেনু দেখতে পাওয়ার কথা:
- শেল্ফে থাকা স্টাইলাস বোতামে ট্যাপ করে নতুন নোট বিকল্প বেছে নিন। এটি করলে একটি খালি ড্রয়িং নোট খুলে যাবে।
- একটি স্ক্রিনশট নিন। শেল্ফ থেকে, স্টাইলাস বোতাম > স্ক্রিন ক্যাপচার করুন অথবা কোনও ছবি ডাউনলোড করুন। বিজ্ঞপ্তিতে ছবি অ্যানোটেট করার বিকল্প থাকতে হবে। এর ফলে, অ্যানোটেশন করার জন্য রেডি থাকা ছবি সহ অ্যাপটি চালু হয়ে যাবে।
মাউস ও টাচপ্যাড কাজ করে
সাধারণত, বেশিরভাগ অ্যাপকে শুধুমাত্র তিনটি বড় স্ক্রিন-কেন্দ্রিক ইভেন্ট ম্যানেজ করতে হয়: রাইট-ক্লিক, হোভার এবং ড্র্যাগ ও ড্রপ।
ডানদিকের বোতামে ক্লিক করুন
যেসব অ্যাকশনের ফলে কোনও অ্যাপ কনটেক্সট মেনু দেখায়, যেমন, কোনও তালিকা আইটেম টাচ করে ধরে রাখা, সেগুলিকে অবশ্যই মাউসের ডানদিকের বোতামে ক্লিক করার ইভেন্টে প্রতিক্রিয়া জানাতে হবে।
মাউসের ডানদিকের বোতামে ক্লিক করার ইভেন্ট হ্যান্ডেল করতে, অ্যাপকে একটি
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-এর জন্য বিশেষ বিবেচনা
- অ্যাপের বাইরে থেকে টেনে আনা আইটেম অ্যাক্সেস করতে
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#changesPointerEventType: পয়েন্টার অ্যাকশন, যেমন প্রেস করা, সরানো, স্ক্রল করা এবং রিলিজ করা
গেম কন্ট্রোলার
কিছু বড় স্ক্রিনের Android ডিভাইসে সর্বাধিক চারটি গেম কন্ট্রোলার কাজ করে। গেম কন্ট্রোলার ম্যানেজ করতে স্ট্যান্ডার্ড Android গেম কন্ট্রোলার API ব্যবহার করুন (কাজ করে এমন গেম কন্ট্রোলার দেখুন)।
সাধারণ ম্যাপিং অনুসরণ করে গেম কন্ট্রোলারের বোতামগুলি সাধারণ ভ্যালুতে ম্যাপ করা হয়। তবে, সব গেম কন্ট্রোলার প্রস্তুতকারী একই ম্যাপিং কনভেনশন অনুসরণ করে না। আপনি যদি ব্যবহারকারীদের বিভিন্ন জনপ্রিয় কন্ট্রোলার ম্যাপিং বেছে নিতে দেন, তাহলে অনেক ভালো অভিজ্ঞতা প্রদান করতে পারবেন। আরও তথ্যের জন্য গেমপ্যাড বোতাম প্রেস প্রসেস করা দেখুন ।
ইনপুট অনুবাদ মোড
ChromeOS ডিফল্ট হিসেবে ইনপুট ট্রান্সলেশন মোড চালু করে। বেশিরভাগ Android অ্যাপের ক্ষেত্রে, এই মোড ডেস্কটপ এনভায়রনমেন্টে অ্যাপকে প্রত্যাশিতভাবে কাজ করতে সাহায্য করে। কিছু উদাহরণ হল টাচপ্যাডে দু'টি আঙুল দিয়ে স্ক্রল করার সুবিধা অটোমেটিক চালু করা, মাউস হুইল স্ক্রল করা এবং উইন্ডো কোঅর্ডিনেটে র ডিসপ্লে কোঅর্ডিনেট ম্যাপ করা। সাধারণত, অ্যাপ ডেভেলপারদের এইসব আচরণ নিজেদেরই প্রয়োগ করার প্রয়োজন হয় না।
কোনও অ্যাপ কাস্টম ইনপুট আচরণ প্রয়োগ করলে, যেমন কাস্টম দু'টি আঙুল দিয়ে টাচপ্যাড পিঞ্চ করার অ্যাকশন নির্ধারণ করা অথবা এইসব ইনপুট ট্রান্সলেশন অ্যাপের প্রত্যাশিত ইনপুট ইভেন্ট প্রদান না করলে, আপনি Android ম্যানিফেস্টে নিম্নলিখিত ট্যাগ যোগ করে ইনপুট ট্রান্সলেশন মোড বন্ধ করে দিতে পারবেন:
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />