আইকন বোতাম ব্যবহারকারীরা যেসব অ্যাকশন নিতে পারেন সেগুলি দেখায়। আইকন বোতামে অবশ্যই একটি স্পষ্ট অর্থযুক্ত আইকন ব্যবহার করতে হবে এবং সাধারণত সাধারণ বা প্রায়ই ব্যবহৃত অ্যাকশনকে উপস্থাপন করতে হবে।
দু'ধরনের আইকন বোতাম আছে:
- ডিফল্ট: এইসব বোতাম মেনু বা সার্চের মতো অন্যান্য এলিমেন্ট খুলতে পারে।
- টগল করা যায়: এইসব বোতাম বাইনারি অ্যাকশনকে উপস্থাপন করতে পারে যা চালু বা বন্ধ করা যায়, যেমন "ফেভারিট" বা "বুকমার্ক"।
API সারফেস
স্ট্যান্ডার্ড আইকন বোতাম প্রয়োগ করতে IconButton কম্পোজ করার উপযুক্ত আইটেম ব্যবহার করুন। ফিল্ড, ফিল্ড টোনাল বা আউটলাইন করা, এই ধরনের আলাদা আলাদা ভিজ্যুয়াল স্টাইল তৈরি করতে, যথাক্রমে
FilledIconButton, FilledTonalIconButton এবং
OutlinedIconButton ব্যবহার করুন।
IconButton-এর মূল প্যারামিটারগুলির মধ্যে এগুলি অন্তর্ভুক্ত:
onClick: ব্যবহারকারী আইকন বোতামে ট্যাপ করলে এক্সিকিউট হওয়া ল্যাম্বডা ফাংশন।enabled: বোতামের চালু থাকার অবস্থাকে নিয়ন্ত্রণ করে এমন একটি বুলিয়ান। যখনfalse, বোতামটি ব্যবহারকারীর ইনপুটের উত্তর দেয় না।content: বোতামের মধ্যে কম্পোজ করা যায় এমন কন্টেন্ট, সাধারণত একটিIcon।
প্রাথমিক উদাহরণ: টগল আইকন বোতাম
এই উদাহরণে টগল আইকন বোতাম কীভাবে প্রয়োগ করতে হয় তা দেখানো হয়েছে। টগল আইকন বোতামটি বেছে নেওয়া হয়েছে না হয়নি তার উপর ভিত্তি করে এর চেহারা পরিবর্তন করে।
@Preview @Composable fun ToggleIconButtonExample() { // isToggled initial value should be read from a view model or persistent storage. var isToggled by rememberSaveable { mutableStateOf(false) } IconButton( onClick = { isToggled = !isToggled } ) { Icon( painter = if (isToggled) painterResource(R.drawable.favorite_filled) else painterResource(R.drawable.favorite), contentDescription = if (isToggled) "Selected icon button" else "Unselected icon button." ) } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
ToggleIconButtonExampleকম্পোজ করার উপযুক্ত আইটেম একটি টগল করা যায় এমনIconButtonনির্ধারণ করে।mutableStateOf(false)একটিMutableStateঅবজেক্ট তৈরি করে যা একটি বুলিয়ান ভ্যালু ধরে রাখে, প্রাথমিকভাবেfalse। এর ফলেisToggledএকটি স্টেট হোল্ডার হয়ে যায়, অর্থাৎ, এর ভ্যালু পরিবর্তন হলেই Compose UI রিকম্পোজ করে।rememberSaveableনিশ্চিত করে যে স্ক্রিন রোটেশনের মতো কনফিগারেশন পরিবর্তন জুড়েisToggledস্টেট বজায় থাকে।
IconButton-এরonClickল্যাম্বডা বোতামে ক্লিক করলেtrueওfalse-এর মধ্যে স্টেট টগল করার মাধ্যমে বোতামের আচরণকে সংজ্ঞায়িত করে।Iconকম্পোজ করার উপযুক্ত আইটেমেরpainterপ্যারামিটার কন্ডিশনের উপর ভিত্তি করে একটি আলাদাpainterResourceলোড করে, যাisToggledস্ট্যাটাসের উপর নির্ভর করে। এর ফলে আইকনের ভিজ্যুয়াল চেহারা পরিবর্তন হয়ে যায়।isToggledtrueহলে, এটি ভর্তি হার্টের ড্রয়েবল লোড করে।isToggled-এর মানfalseহলে, এটি আউটলাইন করা হার্ট ড্রয়েবল লোড করে।
isToggledস্ট্যাটাসের উপর ভিত্তি করেIcon-এরcontentDescription-ও আপডেট হয় যাতে অ্যাক্সেসিবিলিটি সংক্রান্ত উপযুক্ত তথ্য প্রদান করা যায়।
ফলাফল
নিচের ছবিতে আগের স্নিপেটের টগল আইকন বোতামটি বেছে না নেওয়া অবস্থায় দেখানো হয়েছে:
উন্নত উদাহরণ: প্রেস করার পরে রিপিট করা অ্যাকশন
এই বিভাগে কীভাবে আইকন বোতাম তৈরি করতে হয় তা দেখানো হয়েছে। ব্যবহারকারী বোতামটি প্রেস করে ধরে রাখলে, এটি ক্রমাগত অ্যাকশন ট্রিগার করে। প্রতি ক্লিকের জন্য একবার ট্রিগার করার পরিবর্তে এটি করা হয়।
@Composable fun MomentaryIconButton( unselectedImage: Int, selectedImage: Int, contentDescription: String, modifier: Modifier = Modifier, stepDelay: Long = 100L, // Minimum value is 1L milliseconds. onClick: () -> Unit ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val pressedListener by rememberUpdatedState(onClick) LaunchedEffect(isPressed) { while (isPressed) { delay(stepDelay.coerceIn(1L, Long.MAX_VALUE)) pressedListener() } } IconButton( modifier = modifier, onClick = onClick, interactionSource = interactionSource ) { Icon( painter = if (isPressed) painterResource(id = selectedImage) else painterResource(id = unselectedImage), contentDescription = contentDescription, ) } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
MomentaryIconButtonএকটিunselectedImage: Int, বোতাম প্রেস করা না হলে আইকনের জন্য ড্রয়েবল রিসোর্স আইডি এবংselectedImage: Int, বোতাম প্রেস করা হলে আইকনের জন্য ড্রয়েবল রিসোর্স আইডি নেয়।- এটি ব্যবহারকারীর থেকে পাওয়া "প্রেস" ইন্টার্যাকশন ট্র্যাক করার জন্য
interactionSourceব্যবহার করে। - বোতামটি অ্যাক্টিভভাবে প্রেস করা হলে
isPressed-এর মান true হয় এবং অন্যথায় false হয়।isPressedtrueহলে,LaunchedEffectলুপে প্রবেশ করে।- এই লুপের মধ্যে, অ্যাকশন ট্রিগার করার মধ্যে
পজ তৈরি করতে এটি
delay(stepDelayসহ) ব্যবহার করে।coerceInনিশ্চিত করে যে বিলম্ব কমপক্ষে ১ms যাতে অসীম লুপ এড়ানো যায়। - লুপের মধ্যে প্রতিটি বিলম্বের পরে
pressedListenerকল করা হয়। এর ফলে অ্যাকশনটি আবার করা হয়।
- এই লুপের মধ্যে, অ্যাকশন ট্রিগার করার মধ্যে
পজ তৈরি করতে এটি
pressedListenerrememberUpdatedStateব্যবহার করে এটি নিশ্চিত করে যেonClickল্যাম্বডা (যে অ্যাকশন পারফর্ম করতে হবে) যেন সবসময় লেটেস্ট কম্পোজিশন থেকে সবচেয়ে আপ-টু-ডেট হয়।- বোতামটি বর্তমানে প্রেস করা আছে কিনা তার উপর ভিত্তি করে
Iconআইকনটি এর ডিসপ্লে করা ছবি পরিবর্তন করে।isPressedসত্যি হলে,selectedImageদেখানো হয়।- অন্যথায়,
unselectedImageদেখানো হয়।
এরপরে, কোনও উদাহরণে এই MomentaryIconButton ব্যবহার করুন। নিম্নলিখিত স্নিপেট
দুটি আইকন বোতামের মাধ্যমে একটি কাউন্টার কন্ট্রোল করার ডেমো দেখায়:
@Preview() @Composable fun MomentaryIconButtonExample() { var pressedCount by remember { mutableIntStateOf(0) } Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { MomentaryIconButton( unselectedImage = R.drawable.fast_rewind, selectedImage = R.drawable.fast_rewind_filled, stepDelay = 100L, onClick = { pressedCount -= 1 }, contentDescription = "Decrease count button" ) Spacer(modifier = Modifier) Text("advanced by $pressedCount frames") Spacer(modifier = Modifier) MomentaryIconButton( unselectedImage = R.drawable.fast_forward, selectedImage = R.drawable.fast_forward_filled, contentDescription = "Increase count button", stepDelay = 100L, onClick = { pressedCount += 1 } ) } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
MomentaryIconButtonExampleকম্পোজ করার উপযুক্ত ডিসপ্লেতে দুটিMomentaryIconButtonইনস্ট্যান্স ও একটিTextকম্পোজ করার উপযুক্ত এলিমেন্ট আছে যা কাউন্টার বাড়ানো ও কমানোর জন্য UI তৈরি করে।Row- এটি
rememberওmutableIntStateOfব্যবহার করে একটিpressedCountপরিবর্তনযোগ্য স্টেট ভেরিয়েবল বজায় রাখে, যা ০ হিসেবে ইনিশিয়ালাইজ করা হয়।pressedCountপরিবর্তন হলে, এটি লক্ষ্য করা যেকোনও কম্পোজ করার উপযুক্ত আইটেম (যেমনTextকম্পোজ করার উপযুক্ত আইটেম) নতুন ভ্যালু দেখানোর জন্য আবার কম্পোজ করা হয়। - ক্লিক করা বা ধরে রাখলে প্রথম
MomentaryIconButtonকমে যায়pressedCount। - ক্লিক করা হলে বা
হোল্ড করে রাখলে দ্বিতীয়
MomentaryIconButtonবেড়ে যায়pressedCount। - দুটি বোতামই ১০০ মিলিসেকেন্ডের
stepDelayব্যবহার করে, এর অর্থ হল কোনও বোতাম হোল্ড করে রাখলেonClickঅ্যাকশন প্রতি ১০০ মিলিসেকেন্ডে রিপিট হয়।
ফলাফল
নিচের ভিডিওতে আইকন বোতাম ও কাউন্টার সহ UI দেখানো হয়েছে: