Shadow: mohiyati, mobil ilovalarda soyalami yaratish

Muallif: IT Sectr Nashr etilgan: 2026-02-28 O'qish vaqti: 9 daq

Shadow (soya) — mobil interfeyslarda elementlar orasida chuqurlik va iyerarxiya illyuziyasini yaratadigan vizual effektdir. Soyalar qaysi element Z-tekisligida yuqoriroq joylashganini va shuning uchun muhimroq yoki interaktiv ekanligini ko'rsatadi. Material Design Guidelines (Google, 2026) ma'lumotlariga ko'ra, tizim soyalari beshta asosiy balandlikdan (elevation) foydalanadi: 0 dp (tekis), 1–4 dp (tugmalar), 6–12 dp (kartalar), 16–24 dp (dialoglar), 24+ dp (modal oynalar). Elementlarning balandligi haqida batafsil Elevation haqidagi maqolada o'qing.

Asosiy fikrlar

  • Soya (shadow) — element ostidagi maydonni qirralarida xiralashtirib qoraytirish orqali chuqurlik yaratadigan vizual effekt.
  • iOS da soyalar CALayer xususiyatlari orqali sozlanadi: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android da soyalar elevation (Material Design) yoki OutlineProvider orqali maxsus chizish bilan boshqariladi.
  • Jetpack Compose soyalarni Modifier.shadow() va Card/Surface dagi elevation orqali qo'llab-quvvatlaydi.
  • Flutter da soyalar BoxShadow orqali BoxDecoration da yoki PhysicalModel orqali amalga oshiriladi.

UI da soya nima?

Soya (shadow) foydalanuvchi interfeyslarida — yorug'lik va chuqurlikni taqlid qiluvchi vizual effektdir. Soya elementning asl nusxaga nisbatan siljigan qora xira nusxasini chizish orqali yaratiladi. Mobil dizaynda soyalar uchta vazifani bajaradi: iyerarxiyani ko'rsatadi (yuqori element — uzunroq soya), interaktivlikni bildiradi (soyali tugmalar bosiladigan ko'rinadi), tarkibni fondan ajratadi (soyali kartalar alohida bloklar sifatida o'qiladi).

Google-ning Material Design ida soyalar elevation (balandlik) tushunchasi bilan uzviy bog'liq. Har bir element Z-koordinatasida ma'lum bir balandlikni egallaydi va soya yuqoridan yorug'lik proyeksiyasidir. Apple-ning Human Interface Guidelines i qat'iy balandlik tizimini belgilamaydi, lekin interfeyslarda vizual iyerarxiya va chuqurlik yaratish uchun soyalardan foydalanishni tavsiya qiladi.

Nielsen Norman Group (2024) tadqiqotiga ko'ra, to'g'ri joylashtirilgan soyalar interaktiv elementni qidirish vaqtini 24% ga qisqartiradi. Soyalar, shuningdek, ko'rish qobiliyati zaif foydalanuvchilarga elementlar chegaralarini farqlashda yordam beradi. Biroq, soyalardan haddan tashqari foydalanish (ekranda 3+ daraja) kognitiv yukni oshiradi va idrokni yomonlashtiradi.

iOS da soyalar: CALayer va SwiftUI

iOS da soyalar CALayer xususiyatlari orqali amalga oshiriladi: shadowColor soya rangini, shadowOffset — CGSize da siljishni (x, y), shadowRadius — xiralashish radiusini, shadowOpacity — 0 dan 1 gacha shaffoflikni belgilaydi. Samaradorlik uchun shadowPath — soya shaklini tavsiflovchi UIBezierPath ni ham belgilash tavsiya etiladi, shunda Core Animation uni avtomatik hisoblamaydi.

swift
// UIKit: CALayer orqali soya sozlash
import UIKit

let cardView = UIView()
cardView.backgroundColor = .systemBackground
cardView.layer.cornerRadius = 12

// Soya sozlash
cardView.layer.shadowColor = UIColor.black.cgColor
cardView.layer.shadowOpacity = 0.15
cardView.layer.shadowOffset = CGSize(width: 0, height: 4)
cardView.layer.shadowRadius = 8

"> Optimizatsiya: aniq shadowPath
cardView.layer.shadowPath = UIBezierPath(
    roundedRect: cardView.bounds,
    cornerRadius: 12
).cgPath

SwiftUI da soyalar .shadow() modifikatori orqali color, radius, x, y parametrlari bilan belgilanadi. SwiftUI avtomatik ravishda shadowPath ni qo'llaydi va render samaradorligini boshqaradi. Murakkab soyalar uchun (ichki soyalar, bir nechta soyalar) overlay() bilan LinearGradient dan foydalaning.

swift
// SwiftUI: shadow modifikatori orqali soya
import SwiftUI

VStack {
    Text("Soyali karta")
        .padding()
        .background(Color.white)
        .cornerRadius(16)
        .shadow(
            color: .black.opacity(0.15),
            radius: 10,
            x: 0,
            y: 4
        )
}

iOS da soyalar samaradorligi: agar shadowPath belgilanmagan bo'lsa, Core Animation har bir kadrda soya shaklini qatlam shakli asosida hisoblaydi, bu animatsiya paytida sekinlashuvga olib kelishi mumkin. Statik elementlar uchun doimo shadowPath ni belgilang. Animatsiya qilinadigan elementlar uchun CALayer da shouldRasterize = true dan foydalaning, soya alohida qatlamda keshlansin. SwiftUI da rastrlash .drawingGroup() orqali boshqariladi.

Android da soyalar: elevation va maxsus soyalar

Android da Material Design dagi soyalar elevation — elementning Z-koordinatadagi balandligini belgilovchi View xususiyati orqali amalga oshiriladi. Tizim avtomatik ravishda elevation va outlineProvider (element konturi) asosida soya chizadi. Elevation qanchalik baland bo'lsa, soya shunchalik katta va xira bo'ladi. Material Design dan meros olmagan View lar uchun (masalan, AppCompat) soyalar faqat apparat tezlashtirish yoqilgan holda ishlaydi.

xml
<!-- XML: atributlar orqali elevation -->
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="12dp"
    app:cardElevation="6dp">
    <!-- Karta tarkibi -->
</androidx.cardview.widget.CardView>

Maxsus soyalar uchun Android View tizimida OutlineProvider ishlatiladi. ViewOutlineProvider outline.setRoundRect() yoki outline.setPath() orqali ixtiyoriy shakl belgilash imkonini beradi. OutlineProvider bo'lmasa, soya View ning to'rtburchak shakli bo'yicha chiziladi, bu burchaklarning yumaloqligini hisobga olmaydi.

kotlin
// Kotlin: soya uchun maxsus OutlineProvider
import android.graphics.Outline
import android.view.View
import android.view.ViewOutlineProvider

val myView: View = findViewById(R.id.myView)
myView.outlineProvider = object : ViewOutlineProvider() {
    override fun getOutline(view: View, outline: Outline) {
        outline.setRoundRect(
            0, 0, view.width, view.height,
            12f  // burchak radiusi
        )
    }
}
myView.elevation = 8f  // soya balandligi px da
myView.translationZ = 4f  // bosganda qo'shimcha balandlik

Jetpack Compose da soyalar Modifier.shadow() va Card hamda Surface komponentlaridagi elevation orqali boshqariladi. Modifier.shadow() elevation va shape ni qabul qiladi. View tizimidan farqli o'laroq, Compose soyalarni o'z render quvurida chizadi, bu Android ning barcha versiyalarida oldindan bashorat qilinadigan xatti-harakatni ta'minlaydi.

kotlin
// Jetpack Compose: Modifier.shadow orqali soya
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

Card(
    modifier = Modifier.shadow(
        elevation = 6.dp,
        shape = RoundedCornerShape(12.dp),
        clip = false
    ),
    colors = CardDefaults.cardColors(containerColor = Color.White)
) {
    Text("Maxsus soyali Card")
}

Soyalardan foydalanish bo'yicha tavsiyalar

Soyalardan to'g'ri foydalanish interfeysni idrok etishni yaxshilaydi, noto'g'ri foydalanish — vizual shovqin yaratadi va samaradorlikni pasaytiradi. Material Design besh daraja elevation ni belgilaydi: 0 dp (soyasiz), 1–4 dp (tugmalar, chiplar), 6–12 dp (kartalar, menyular), 16–24 dp (dialoglar, pastki panellar), 24+ dp (modal oynalar, FAB).

DarajaElevationElementlarSoya tavsifi
00 dpMatn, ikonkalar, fonSoyasiz, tekis qatlam
11–4 dpTugmalar, kiritish maydonlariYengil soya, kichik siljish
26–12 dpKartalar, SnackbarO'rtacha soya, sezilarli xiralashish
316–24 dpDialoglar, menyularChuqur soya, katta xiralashish
424+ dpModal oynalarMaksimal soya, element suzib yuradi

Yaxshi uslub qoidalari: (1) e'tiborni jalb qilmasligi kerak bo'lgan elementlar (fonlar, ajratgichlar) uchun soya ishlatmang, (2) soya balandligi elementning ahamiyatiga mos kelishi kerak — qanchalik muhim bo'lsa, shunchalik baland, (3) tugmani bosganda taktil teskari aloqa uchun elevation ni animatsiya bilan kamaytiring, (4) qorong'i fonlarda soyalardan qoching — soya o'rniga overlay (yoritish/qoraytirish) dan foydalaning. Material You (Android 12+) da soyalar mavzuga moslashadi: qorong'i fonda elevation rang qatlami (surface tint) bilan almashtiriladi.

Flutter da soyalar: BoxShadow va PhysicalModel

Flutter da soyalar BoxDecoration ichidagi BoxShadow orqali amalga oshiriladi. BoxShadow color, offset, blurRadius va spreadRadius ni qabul qiladi. Flutter bir nechta soyalarni qo'llab-quvvatlaydi: BoxShadow ro'yxatini uzatish murakkab effektlar yaratish imkonini beradi — masalan, tashqi soya + ichki yoritish. PhysicalModel — shaklga asoslangan fizik soyani simulyatsiya qiluvchi muqobil (BeveledRectangleBorder, CircleBorder).

dart
// Flutter: BoxDecoration + BoxShadow orqali soya
import 'package:flutter/material.dart';

Container(
    decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(12.0),
        boxShadow: [
            BoxShadow(
                color: Colors.black.withOpacity(0.15),
                offset: Offset(0, 4),
                blurRadius: 8.0,
                spreadRadius: 0,
            ),
        ],
    ),
    child: Text('Soyali konteyner'),
)

// Fizik soya uchun PhysicalModel
PhysicalModel(
    color: Colors.white,
    elevation: 6.0,
    shadowColor: Colors.black.withOpacity(0.2),
    borderRadius: BorderRadius.circular(12.0),
    child: Text('Soyali fizik model'),
)

Samaradorlik: Bir nechta soyalarga ega BoxShadow har bir o'zgarishda qayta chizishga (repaint) sabab bo'lishi mumkin. Statik elementlar uchun PhysicalModel dan foydalaning — u soyani alohida qatlamda keshlaydi (RepaintBoundary). Flutter 3.16+ da mavzuga (yorug'/qorong'i) qarab rang va xiralikni o'zgartiruvchi adaptiv soyalar bilan Material 3 elevation qo'llab-quvvatlanishi qo'shilgan.

Tez-tez so'raladigan savollar

Elevation soyadan qanday farq qiladi?

Elevation — elementning Z-koordinatadagi sonli balandligi, shadow (soya) esa bu balandlik tomonidan yaratilgan vizual effektdir. Android da elevation — avtomatik ravishda soya yaratadigan View xususiyatidir. Dizaynda elevation va shadow ko'pincha bir-birini almashtiradigan atamalar sifatida ishlatiladi, lekin texnik jihatdan elevation sabab, shadow esa natijadir.

Nega Android da soya ko'rinmaydi?

Tekshiring: (1) View da elevation 0 dan katta belgilangan, (2) outlineProvider belgilangan (agar View Material kutubxonasidan bo'lmasa), (3) apparat tezlashtirish yoqilgan (manifestda android:hardwareAccelerated="true"). CardView outlineProvider ni avtomatik boshqaradi. Maxsus View lar uchun view.outlineProvider = ViewOutlineProvider.BACKGROUND ni chaqiring.

iOS da ichki soya (inner shadow) qanday qilish mumkin?

CALayer to'g'ridan-to'g'ri ichki soyalarni qo'llab-quvvatlamaydi. Kombinatsiyadan foydalaning: mask ichida qora rang va shaffoflik bilan CAGradientLayer yoki rastr ichki soyaga ega UIImageView joylashtiring. SwiftUI da ichki soya overlay bilan LinearGradient va blendMode(.multiply) orqali amalga oshiriladi.

Tugmani bosganda soyani qanday animatsiya qilish mumkin?

Android da animatsiya uchun translationZ dan foydalaning: tinch holatda elevation = 2 dp, bosganda translationZ = 4 dp (umumiy balandlik 6 dp). iOS da shadowOffset va shadowRadius ni tugma transformatsiyasi bilan bir vaqtda animatsiya qiling. SwiftUI da withAnimation bilan Modifier.shadow() orqali elevation o'zgarishidan foydalaning. Flutter da — BoxShadow o'zgarishi bilan AnimatedContainer.

Bir ekranda nechta soyadan foydalanish mumkin?

Material Design bir ekranda uch darajadan ko'p elevation ni tavsiya etmaydi. Agar soyali elementlar ko'p bo'lsa — ularni bir xil balandlikdagi guruhlarga birlashtiring. Haddan tashqari ko'p soyalar vizual shovqin yaratadi va o'rta hamda byudjet segmentidagi qurilmalarda render samaradorligini pasaytiradi.

Xulosa

  • Soya (shadow) — elementning Z-koordinatadagi elevation iga asoslangan vizual chuqurlik effekti.
  • iOS da soyalar CALayer orqali sozlanadi: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android da soyalar elevation va maxsus shakl uchun OutlineProvider orqali boshqariladi.
  • Material Design besh daraja elevation ni belgilaydi: 0, 1–4, 6–12, 16–24 va 24+ dp.
  • Jetpack Compose soyalarni boshqarish uchun Modifier.shadow() va Card/Surface dagi elevation dan foydalanadi.
  • Flutter soyalarni BoxShadow (BoxDecoration) va PhysicalModel (fizik soya) orqali amalga oshiradi.
  • Optimallashtirish: shadowPath (iOS), outlineProvider (Android) belgilang, PhysicalModel (Flutter) dan foydalaning.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing