verticalScroll
এবং
horizontalScroll
মডিফায়ারগুলি ব্যবহারকারীকে কোনও এলিমেন্ট স্ক্রল করার অনুমতি দেওয়ার সবচেয়ে সহজ উপায় প্রদান করে, যখন
এর কন্টেন্টের বাউন্ড এর সর্বাধিক সাইজ সংক্রান্ত বিধিনিষেধের থেকে বড় হয়। verticalScroll এবং horizontalScroll মডিফায়ার ব্যবহার করলে আপনাকে কন্টেন্ট
ট্রান্সলেট বা অফসেট করতে হবে না।
@Composable private fun ScrollBoxes() { Column( modifier = Modifier .background(Color.LightGray) .size(100.dp) .verticalScroll(rememberScrollState()) ) { repeat(10) { Text("Item $it", modifier = Modifier.padding(2.dp)) } } }
ScrollState
আপনাকে স্ক্রল পজিশন পরিবর্তন করতে বা এর বর্তমান অবস্থা পেতে দেয়। ডিফল্ট প্যারামিটার
সহ এটি তৈরি করতে, rememberScrollState()
ব্যবহার করুন।
@Composable private fun ScrollBoxesSmooth() { // Smoothly scroll 100px on first composition val state = rememberScrollState() LaunchedEffect(Unit) { state.animateScrollTo(100) } Column( modifier = Modifier .background(Color.LightGray) .size(100.dp) .padding(horizontal = 8.dp) .verticalScroll(state) ) { repeat(10) { Text("Item $it", modifier = Modifier.padding(2.dp)) } } }
স্ক্রল করা যায় এমন এরিয়া মডিফায়ার
scrollableArea মডিফায়ার হল কাস্টম স্ক্রল করা যায় এমন কন্টেনার তৈরি করার
একটি মৌলিক বিল্ডিং ব্লক। এটি
scrollable মডিফায়ারের উপর একটি উচ্চ-স্তরের অ্যাবস্ট্রাকশন প্রদান করে, জেসচার ডেল্টা
ইন্টারপ্রিটেশন, কন্টেন্ট ক্লিপিং এবং ওভারস্ক্রল এফেক্টের মতো সাধারণ প্রয়োজনীয়তা হ্যান্ডেল করে।
scrollableArea কাস্টম ইমপ্লিমেন্টেশনের জন্য ব্যবহার করা হলেও, সাধারণ স্ক্রল করার তালিকার জন্য আপনাকে সাধারণত
verticalScroll, horizontalScroll,
অথবা LazyColumn-এর মতো কম্পোজ করার উপযুক্ত আইটেমের মতো রেডিমেড সমাধান ব্যবহার করতে হবে। এইসব
উচ্চ-স্তরের কম্পোনেন্ট সাধারণ ব্যবহারের ক্ষেত্রে অনেক সহজ এবং এগুলিও
scrollableArea ব্যবহার করে তৈরি করা হয়।
scrollableArea ও scrollable মডিফায়ারের মধ্যে পার্থক্য
scrollableArea ও scrollable-এর মধ্যে প্রধান পার্থক্য হল, সেগুলি কীভাবে ব্যবহারকারীর স্ক্রল জেসচার
ব্যাখ্যা করে:
scrollable(র ডেল্টা): ডেল্টা সরাসরি স্ক্রিনে ব্যবহারকারীর ইনপুটের (যেমন, পয়েন্টার ড্র্যাগ করা) ফিজিক্যাল মুভমেন্টকে প্রতিফলিত করে।scrollableArea(কন্টেন্ট-ভিত্তিক ডেল্টা):deltaহল শব্দার্থগতভাবে ইনভার্টেড যা স্ক্রল পজিশনে নির্বাচিত পরিবর্তনকে উপস্থাপন করে যাতে কন্টেন্ট ব্যবহারকারীর জেসচারের সাথে সাথে সরে যাচ্ছে বলে মনে হয়, এটি সাধারণত পয়েন্টারের মুভমেন্টের বিপরীত হয়।
বিষয়টি এভাবে ভাবুন: scrollable আপনাকে জানায় যে কীভাবে পয়েন্টারটি সরেছে, অন্যদিকে
scrollableArea সেই পয়েন্টার মুভমেন্টকে এমনভাবে ট্রান্সলেট করে যাতে সাধারণ স্ক্রল করা যায় এমন ভিউয়ের মধ্যে কন্টেন্ট কীভাবে
সরতে পারে। এই ইনভার্সনের কারণেই, একটি স্ট্যান্ডার্ড স্ক্রল করা যায় এমন কন্টেনার প্রয়োগ করার সময় scrollableArea
আরও স্বাভাবিক মনে হয়।
সাধারণ পরিস্থিতির জন্য ডেল্টা চিহ্নের সারসংক্ষেপ নিচে দেওয়া হল:
ব্যবহারকারীর জেসচার |
|
|
|---|---|---|
পয়েন্টার উপরে সরে যায় |
নেগেটিভ |
ইতিবাচক |
পয়েন্টার নিচের দিকে যায় |
ইতিবাচক |
নেগেটিভ |
পয়েন্টার বাঁদিকে সরে যায় |
নেগেটিভ |
ইতিবাচক (RTL-এর জন্য নেতিবাচক) |
পয়েন্টার ডানদিকে সরে যায় |
ইতিবাচক |
নেগেটিভ (RTL-এর জন্য পজিটিভ) |
(*) ডেল্টা চিহ্নের ব্যাপারে মনে রাখবেন: scrollableArea থেকে ডেল্টার চিহ্নটি
scrollableArea শুধু একটি সাধারণ ইনভার্সন নয়। এটি বুদ্ধিদীপ্তভাবে এগুলি বিবেচনা করে:
- ওরিয়েন্টেশন: উল্লম্ব বা অনুভূমিক।
LayoutDirection: বাঁদিক থেকে ডানদিক বা ডানদিক থেকে বাঁদিক (বিশেষ করে অনুভূমিক স্ক্রলিংয়ের জন্য গুরুত্বপূর্ণ)।reverseScrollingফ্ল্যাগ: স্ক্রল করার দিক উল্টো দিকে আছে কিনা।
স্ক্রল ডেল্টা ইনভার্ট করা ছাড়াও, scrollableArea লেআউটের
সীমার মধ্যে কন্টেন্ট ক্লিপ করে এবং ওভারস্ক্রল
ইফেক্ট রেন্ডার করা ম্যানেজ করে। ডিফল্ট হিসেবে, এটি LocalOverscrollFactory-এর দেওয়া এফেক্ট ব্যবহার করে।
scrollableArea ওভারলোড
ব্যবহার করে আপনি এটি কাস্টমাইজ বা বন্ধ করতে পারবেন, যা একটি OverscrollEffect প্যারামিটার গ্রহণ করে।
scrollableArea মডিফায়ার কখন ব্যবহার করতে হয়
horizontalScroll বা verticalScroll মডিফায়ার অথবা লেজি লেআউট দিয়ে কাস্টম
স্ক্রলিং কম্পোনেন্ট তৈরি করা না গেলে, আপনাকে scrollableArea মডিফায়ার ব্যবহার করতে হবে।
এর মধ্যে প্রায়শই এইসব বিষয় থাকে:
- কাস্টম লেআউট লজিক: স্ক্রল পজিশনের উপর ভিত্তি করে আইটেমের অ্যারেঞ্জমেন্ট ডায়নামিক পরিবর্তন হলে।
- অনন্য ভিজ্যুয়াল এফেক্ট: স্ক্রল করার সময় বাচ্চাদের উপর ট্রান্সফর্মেশন, স্কেলিং বা অন্যান্য এফেক্ট প্রয়োগ করা।
- সরাসরি কন্ট্রোল:
verticalScrollবা অলস লেআউট যা দেখায় তার বাইরে স্ক্রল করার মেকানিক্সের উপর ফাইন-গ্রেন কন্ট্রোল প্রয়োজন।
scrollableArea ব্যবহার করে চাকার মতো কাস্টম তালিকা তৈরি করা
নিচের নমুনাটি কাস্টম
ভার্টিক্যাল তালিকা তৈরি করতে scrollableArea ব্যবহার করার ডেমো দেখায়, যেখানে আইটেমগুলি কেন্দ্র থেকে দূরে সরে যাওয়ার সাথে সাথে ছোট হয়ে যায়, এর ফলে "চাকার মতো" ভিজ্যুয়াল এফেক্ট তৈরি হয়। এই ধরনের স্ক্রল-নির্ভর ট্রান্সফর্মেশন scrollableArea-এর জন্য
পারফেক্ট ব্যবহারিক প্রয়োগ।
scrollableArea ব্যবহার করে কাস্টমাইজ করা উল্লম্ব তালিকা।
@Composable private fun ScrollableAreaSample() { // ... Layout( modifier = Modifier .size(150.dp) .scrollableArea(scrollState, Orientation.Vertical) .background(Color.LightGray), // ... ) { measurables, constraints -> // ... // Update the maximum scroll value to not scroll beyond limits and stop when scroll // reaches the end. scrollState.maxValue = (totalHeight - viewportHeight).coerceAtLeast(0) // Position the children within the layout. layout(constraints.maxWidth, viewportHeight) { // The current vertical scroll position, in pixels. val scrollY = scrollState.value val viewportCenterY = scrollY + viewportHeight / 2 var placeableLayoutPositionY = 0 placeables.forEach { placeable -> // This sample applies a scaling effect to items based on their distance // from the center, creating a wheel-like effect. // ... // Place the item horizontally centered with a layer transformation for // scaling to achieve wheel-like effect. placeable.placeRelativeWithLayer( x = constraints.maxWidth / 2 - placeable.width / 2, // Offset y by the scroll position to make placeable visible in the viewport. y = placeableLayoutPositionY - scrollY, ) { scaleX = scaleFactor scaleY = scaleFactor } // Move to the next item's vertical position. placeableLayoutPositionY += placeable.height } } } } // ...
স্ক্রল করা যায় এমন মডিফায়ার
scrollable
মডিফায়ারটি স্ক্রল মডিফায়ার থেকে আলাদা, কারণ scrollable স্ক্রল
জেসচার শনাক্ত করে এবং ডেল্টা ক্যাপচার করে, কিন্তু এর কন্টেন্ট অটোমেটিক
অফসেট করে না। এর পরিবর্তে, এটি ব্যবহারকারীর কাছে
ScrollableState
মারফত ডেলিগেট করা হয়, যা এই মডিফায়ার সঠিকভাবে কাজ করার জন্য প্রয়োজন।
ScrollableState তৈরি করার সময়, আপনাকে অবশ্যই এমন একটি consumeScrollDelta
ফাংশন প্রদান করতে হবে যা প্রতিটি স্ক্রল স্টেপে (জেসচার ইনপুট, স্মুথ
স্ক্রলিং বা ফ্লিংয়ের মাধ্যমে) পিক্সেলের ডেল্টা সহ ইনভোক করা হবে। এই ফাংশনকে অবশ্যই স্ক্রল করার দূরত্বের
পরিমাণ রিটার্ন করতে হবে, যাতে নিশ্চিত করা যায় যে নেস্ট করা এলিমেন্ট থাকলে, যেখানে scrollable
মডিফায়ার আছে, সেখানে ইভেন্টটি সঠিকভাবে
প্রোপাগেট করা হয়েছে।
নিচের স্নিপেটটি জেসচার শনাক্ত করে এবং অফসেটের জন্য একটি সংখ্যাসূচক মান দেখায়, কিন্তু কোনও এলিমেন্ট অফসেট করে না:
@Composable private fun ScrollableSample() { // actual composable state var offset by remember { mutableFloatStateOf(0f) } Box( Modifier .size(150.dp) .scrollable( orientation = Orientation.Vertical, // Scrollable state: describes how to consume // scrolling delta and update offset state = rememberScrollableState { delta -> offset += delta delta } ) .background(Color.LightGray), contentAlignment = Alignment.Center ) { Text(offset.toString()) } }
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- জেসচার সম্পর্কে বুঝুন
- Compose-এ
CoordinatorLayoutমাইগ্রেট করা - কম্পোজে ভিউ ব্যবহার করা