معرفی کامپوننت Surface در Jetpack Compose
کامپوننت Surface در Jetpack Compose یک ابزار بنیادین و بسیار کارآمد برای تعریف ظاهر بصری و ساختاردهی محتوا است. این کامپوننت فراتر از یک لایه ساده عمل میکند و ویژگیهای مهمی نظیر عمق سهبعدی، رنگآمیزی، و شکل ظاهری را به اجزای درون خود تزریق میکند.
Jetpack Compose یک چارچوب مدرن برای توسعه رابط کاربری در برنامههای اندروید است که به عنوان پاسخگو به نیازهای روزافزون توسعهدهندگان طراحی شده است. این چارچوب به وسیلهی رویکردی مبتنی بر کامپوننتهای اعلانی (Declarative) به برنامهنویسان اجازه میدهد تا به راحتی و به صورت منعطف، رابطهای کاربری زیبا و کاربرپسند بسازند.
یکی از عناصر کلیدی در Jetpack Compose، کامپوننت Surface است که میتواند به عنوان یک پایه برای نمایش محتوا و طراحی اجزای مختلف رابط کاربری استفاده شود.
این کامپوننت به توسعهدهندگان این امکان را میدهد که ویژگیهای بصری چون رنگ پسزمینه، سایه، و شکل ظاهری را به المانهای خود اعمال کنند. در این مقاله، به بررسی اجزای مختلف و کارکردهای Surface خواهیم پرداخت و نحوه بهرهبرداری از آن را در طراحی رابطهای کاربری بررسی میکنیم.


۱. ایجاد یک Surface پایه
برای تعریف این کامپوننت ، باید آن را با استفاده از کامپوننت Surface() فراخوانی کنید و حداقل محتوای داخلی (content) آن را مشخص نمایید.
مثال کد پایه:
Surface(
modifier = Modifier
.height(150.dp)
.width(250.dp)
.padding(1.dp), /* حاشیه برای کل سطح */
color = Color(0xFFA1E2EB), /* رنگ پسزمینه فیروزهای روشن */
elevation = 40.dp, /* سایه قوی */
shape = RoundedCornerShape(20.dp) /* گوشههای گرد */
) {
Text(
text = "Basic Surface",
modifier = Modifier.padding(16.dp) /* حاشیه داخلی برای متن */
)
}
در این مثال، ما از Modifier برای کنترل ابعاد و حاشیهبندی، color برای رنگ پسزمینه، elevation برای ایجاد اثر سایه، و shape برای گرد کردن گوشهها استفاده کردیم.
مطالعه بیشتر : آموزش Modifier در کامپوز
۲. پارامترهای کلیدی
این کامپوننت با پارامترهای متعددی برای سفارشیسازی کامل عرضه میشود. درک این پارامترها برای طراحی دقیق رابط کاربری ضروری است:
| پارامتر | نوع داده | توضیحات تکمیلی |
| modifier | Modifier | برای اعمال ویژگیهای چیدمان، اندازه، و تعاملات (مثل چرخش، اندازهدهی، و حاشیه بیرونی) به خود این کامپوننت. |
| color | Color | رنگ پسزمینه اصلی Surface. این رنگ با رنگ محتوای داخلی (بر اساس contentColor) تداخل دارد. |
| elevation | Dp | میزان برجستگی سطح (عمق سهبعدی) که مستقیماً بر شدت سایه ایجاد شده تأثیر میگذارد. |
| shape | Shape | شکل ظاهری کلی Surface (مثلاً RoundedCornerShape برای گوشههای گرد، یا CircleShape برای دایره). |
| border | BorderStroke | یک حاشیه (خط دور) با ضخامت و رنگ مشخص که در بالای shape اعمال میشود. |
| contentColor | Color | رنگ پیشفرض برای محتوای داخل این کامپوننت(مانند متن یا آیکونها). اگر تنظیم نشود، بر اساس color و تم برنامه انتخاب میشود. |
| onClick | (() -> Unit)? | اگر این پارامتر تنظیم شود، Surface به یک منطقه قابل کلیک تبدیل میشود و افکتهای تعاملی (مانند تغییر رنگ موقت) را نیز پشتیبانی میکند. |
| enabled | Boolean | مشخص میکند که آیا این کامپوننت فعال است یا خیر. در حالت غیرفعال، ممکن است رنگ و سایه آن تغییر کند (بستگی به تم دارد). |
۲.۱. عمق (Elevation) و اثر سایه
پارامتر elevation مسئول ایجاد توهم عمق سهبعدی است. در طراحی متریال (Material Design)، سطوحی که elevation بالاتری دارند، از دید کاربر بالاتر به نظر میرسند و سایه بزرگتر و تیرهتری زیر آنها میافتد. این ویژگی برای مشخص کردن سلسله مراتب بصری عناصر بسیار مهم است.
نکته: زمانی که elevation یک مقدار بزرگ (مثلاً 40.dp) را میگیرد، سایه ایجاد شده نیز قویتر خواهد بود و باعث میشود عنصر از زمینهی زیرین خود کاملاً متمایز شود.
۲.۲. رنگ پسزمینه (color) و حاشیهبندی
رنگ پسزمینه توسط پارامتر color تنظیم میشود. نکته مهم: اگر بخواهید از Modifier برای تعیین رنگ استفاده کنید (مانند Modifier.background(…))، این تغییر رنگ بر پارامتر color اولویت دارد و رنگ نهایی Surface را تعیین میکند.
مثال تضاد رنگ:
در این مثال، با وجود اینکه color در Surface تنظیم شده است، Modifier.background(Color.Blue) بر آن غلبه کرده و پسزمینه آبی میشود:
Surface(
modifier = Modifier
.height(150.dp)
.width(250.dp)
.padding(25.dp)
.background(Color.Blue), /* این رنگ بر color اصلی ارجحیت دارد */
color = Color(0xFF79EBE0), /* این رنگ نادیده گرفته میشود مگر اینکه Modifier.background نباشد */
shape = CircleShape /* شکل دایرهای */
) {
Text(text = "BackGround Color", Modifier.padding(16.dp))
}
۲.۳. اعمال حاشیه (border)
میتوانید با استفاده از پارامتر border، یک خط مرزی مشخص به دور Surface اضافه کنید. این حاشیه با ضخامت مشخصی (مثلاً 5.dp) و رنگ دلخواه، روی شکل کلی اعمال میشود و معمولاً پس از اعمال shape رسم میگردد.
Surface(
modifier = Modifier
.height(150.dp)
.width(250.dp)
.padding(25.dp)
.border(5.dp, Color.Red), /* حاشیه 5 پیکسلی قرمز */
color = Color(0xFF78AEDA),
shape = RectangleShape /* مستطیل کامل */
) {
// محتوا
}
جمعبندی: چرا Surface مهم است؟
Surface به توسعهدهندگان اجازه میدهد تا مفاهیم طراحی سطح (مانند سایهها و سلسله مراتب) را به راحتی در کدهای اعلانی (Declarative) پیادهسازی کنند. این کامپوننت نه تنها زیبایی بصری را فراهم میکند، بلکه با پارامترهایی مانند onClick و enabled، قابلیت تعاملپذیری و وضعیتدهی (State Handling) را نیز برای اجزای پیچیدهتر مانند کارتها (Cards) و دکمهها ممکن میسازد.






