Shadow: mahiyyəti, mobil tətbiqlərdə kölgələrin yaradılması

Müəllif: IT Sectr Dərc olunub: 2026-02-28 Oxuma vaxtı: 9 dəq

Shadow (kölgə) — mobil interfeyslərdə elementlər arasında dərinlik və iyerarxiya illüziyası yaradan vizual effektdir. Kölgələr hansı elementin Z müstəvisində daha yüksəkdə yerləşdiyini və buna görə də daha vacib və ya interaktiv olduğunu göstərir. Material Design Guidelines (Google, 2026) məlumatına görə, sistem kölgələri beş əsas hündürlükdən (elevation) istifadə edir: 0 dp (düz), 1–4 dp (düymələr), 6–12 dp (kartlar), 16–24 dp (dialoqlar), 24+ dp (modal pəncərələr). Elementlərin hündürlüyü haqqında daha ətraflı Elevation haqqında məqalədə oxuyun.

Əsas məqamlar

  • Kölgə (shadow) — elementin altındakı sahənin kənarlarda bulanıqlaşdırılaraq qaraldılması ilə dərinlik yaradan vizual effektdir.
  • iOS-da kölgələr CALayer xüsusiyyətləri ilə təyin edilir: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android-də kölgələr elevation (Material Design) və ya OutlineProvider vasitəsilə fərdi çərçivə ilə idarə olunur.
  • Jetpack Compose kölgələri Modifier.shadow() və Card/Surface-də elevation vasitəsilə dəstəkləyir.
  • Flutter-da kölgələr BoxShadow ilə BoxDecoration-da və ya PhysicalModel vasitəsilə həyata keçirilir.

UI-da kölgə nədir?

Kölgə (shadow) istifadəçi interfeyslərində — işıqlandırma və dərinliyi təqlid edən vizual effektdir. Kölgə elementin orijinala nisbətən yerdəyişmiş tünd bulanıq surətinin çəkilməsi ilə yaradılır. Mobil dizaynda kölgələr üç funksiya yerinə yetirir: iyerarxiyanı göstərir (yüksək element — daha uzun kölgə), interaktivliyi bildirir (kölgəli düymələr basıla bilən görünür), məzmunu fondan ayırır (kölgəli kartlar ayrı bloklar kimi qəbul olunur).

Google-un Material Design-da kölgələr elevation (hündürlük) konsepti ilə ayrılmaz şəkildə bağlıdır. Hər bir element Z koordinatında müəyyən bir hündürlük tutur və kölgə yuxarıdan işıqlandırmanın proyeksiyasıdır. Apple-ın Human Interface Guidelines-ı ciddi hündürlük sistemi tələb etmir, lakin interfeyslərdə vizual iyerarxiya və dərinlik yaratmaq üçün kölgələrdən istifadə etməyi tövsiyə edir.

Nielsen Norman Group (2024) araşdırmasına görə, düzgün yerləşdirilmiş kölgələr interaktiv elementin axtarış müddətini 24% azaldır. Kölgələr həmçinin görmə qüsuru olan istifadəçilərə elementlərin sərhədlərini ayırd etməyə kömək edir. Lakin həddindən artıq kölgə istifadəsi (ekranda 3+ səviyyə) idrak yükünü artırır və qavrayışı pisləşdirir.

iOS-da kölgələr: CALayer və SwiftUI

iOS-da kölgələr CALayer xüsusiyyətləri vasitəsilə həyata keçirilir: shadowColor kölgənin rəngini, shadowOffset — CGSize-də yerdəyişməni (x, y), shadowRadius — bulanıqlıq radiusunu, shadowOpacity — 0-dan 1-ə qədər qeyri-şəffaflığı təyin edir. Məhsuldarlıq üçün həmçinin shadowPath — kölgənin formasını təsvir edən UIBezierPath təyin etmək tövsiyə olunur ki, Core Animation onu avtomatik hesablamasın.

swift
// UIKit: CALayer vasitəsilə kölgə konfiqurasiyası
import UIKit

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

// Kölgə konfiqurasiyası
cardView.layer.shadowColor = UIColor.black.cgColor
cardView.layer.shadowOpacity = 0.15
cardView.layer.shadowOffset = CGSize(width: 0, height: 4)
cardView.layer.shadowRadius = 8

"> Optimallaşdırma: aşkar shadowPath
cardView.layer.shadowPath = UIBezierPath(
    roundedRect: cardView.bounds,
    cornerRadius: 12
).cgPath

SwiftUI-da kölgələr .shadow() modifikatoru ilə color, radius, x, y parametrləri ilə təyin edilir. SwiftUI avtomatik olaraq shadowPath tətbiq edir və render məhsuldarlığını idarə edir. Qabaqcıl kölgələr üçün (daxili kölgələr, çoxsaylı kölgələr) overlay() ilə LinearGradient istifadə edin.

swift
// SwiftUI: shadow modifikatoru ilə kölgə
import SwiftUI

VStack {
    Text("Kölgəli kart")
        .padding()
        .background(Color.white)
        .cornerRadius(16)
        .shadow(
            color: .black.opacity(0.15),
            radius: 10,
            x: 0,
            y: 4
        )
}

iOS-da kölgələrin məhsuldarlığı: shadowPath təyin edilməyibsə, Core Animation hər kadrda təbəqənin formasına əsasən kölgə hesablayır ki, bu da animasiya zamanı ləngimələrə səbəb ola bilər. Statik elementlər üçün həmişə shadowPath təyin edin. Animasiya edilən elementlər üçün CALayer-də shouldRasterize = true istifadə edin ki, kölgə ayrıca təbəqədə keşlənsin. SwiftUI-də rasterizasiya .drawingGroup() vasitəsilə idarə olunur.

Android-də kölgələr: elevation və fərdi kölgələr

Android-də Material Design-da kölgələr elevation — elementin Z koordinatında hündürlüyünü təyin edən View xüsusiyyəti vasitəsilə həyata keçirilir. Sistem avtomatik olaraq elevation və outlineProvider (elementin konturu) əsasında kölgə çəkir. Elevation nə qədər yüksəkdirsə, kölgə bir o qədər böyük və bulanıq olur. Material Design-dan miras almayan View-lər üçün (məsələn, AppCompat) kölgələr yalnız aparat sürətləndirilməsi aktiv olduqda işləyir.

xml
<!-- XML: atributlar vasitəsilə 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">
    <!-- Kartın məzmunu -->
</androidx.cardview.widget.CardView>

Fərdi kölgələr üçün Android View Sistemində OutlineProvider istifadə olunur. ViewOutlineProvider outline.setRoundRect() və ya outline.setPath() vasitəsilə ixtiyari forma təyin etməyə imkan verir. OutlineProvider olmadan kölgə View-in düzbucaqlı formasına görə çəkilir ki, bu da künclərin yuvarlaqlaşdırılmasını nəzərə almır.

kotlin
// Kotlin: kölgə üçün fərdi 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  // künc radiusu
        )
    }
}
myView.elevation = 8f  // kölgə hündürlüyü px ilə
myView.translationZ = 4f  // basarkən əlavə hündürlük

Jetpack Compose-da kölgələr Modifier.shadow() və Card və Surface komponentlərində elevation vasitəsilə idarə olunur. Modifier.shadow() elevation və shape qəbul edir. View System-dən fərqli olaraq, Compose kölgələri öz render boru kəmərində çəkir ki, bu da Android-in bütün versiyalarında daha proqnozlaşdırıla bilən davranış təmin edir.

kotlin
// Jetpack Compose: Modifier.shadow ilə kölgə
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("Fərdi kölgəli Card")
}

Kölgələrdən istifadə üzrə tövsiyələr

Kölgələrin düzgün istifadəsi interfeysin qavranılmasını yaxşılaşdırır, düzgün olmayan istifadə isə vizual səs-küy yaradır və məhsuldarlığı pisləşdirir. Material Design beş elevation səviyyəsi müəyyən edir: 0 dp (kölgəsiz), 1–4 dp (düymələr, çiplər), 6–12 dp (kartlar, menyular), 16–24 dp (dialoqlar, alt panellər), 24+ dp (modal pəncərələr, FAB).

SəviyyəElevationElementlərKölgənin xarakteristikası
00 dpMətn, ikonlar, fonKölgəsiz, düz təbəqə
11–4 dpDüymələr, daxiletmə sahələriYüngül kölgə, kiçik yerdəyişmə
26–12 dpKartlar, SnackbarOrta kölgə, nəzərə çarpan bulanıqlıq
316–24 dpDialoqlar, menyularDərin kölgə, böyük bulanıqlıq
424+ dpModal pəncərələrMaksimal kölgə, element süzülür

Yaxşı tərz qaydaları: (1) diqqət çəkməməli olan elementlər üçün (fonlar, ayırıcılar) kölgə istifadə etməyin, (2) kölgənin hündürlüyü elementin vacibliyinə uyğun olmalıdır — nə qədər vacibdirsə, bir o qədər yüksək, (3) düyməyə basarkən toxunma əks-əlaqəsi üçün elevation-ı animasiya ilə azaldın, (4) tünd fonlarda kölgələrdən qaçın — kölgə əvəzinə overlay (işıqlandırma/qaralma) istifadə edin. Material You-da (Android 12+) kölgələr mövzuya uyğunlaşır: tünd fonda elevation rəng qatı (surface tint) ilə əvəz olunur.

Flutter-da kölgələr: BoxShadow və PhysicalModel

Flutter-da kölgələr BoxDecoration daxilində BoxShadow vasitəsilə həyata keçirilir. BoxShadow color, offset, blurRadius və spreadRadius qəbul edir. Flutter çoxsaylı kölgələri dəstəkləyir: BoxShadow siyahısının ötürülməsi mürəkkəb effektlər yaratmağa imkan verir — məsələn, xarici kölgə + daxili işıqlandırma. PhysicalModel — formaya əsasən fiziki kölgə simulyasiya edən alternativ (BeveledRectangleBorder, CircleBorder).

dart
// Flutter: BoxDecoration + BoxShadow ilə kölgə
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('Kölgəli konteyner'),
)

// Fiziki kölgə üçün PhysicalModel
PhysicalModel(
    color: Colors.white,
    elevation: 6.0,
    shadowColor: Colors.black.withOpacity(0.2),
    borderRadius: BorderRadius.circular(12.0),
    child: Text('Kölgəli fiziki model'),
)

Məhsuldarlıq: Çoxsaylı kölgələrə malik BoxShadow hər dəyişiklikdə yenidən çəkməyə (repaint) səbəb ola bilər. Statik elementlər üçün PhysicalModel istifadə edin — o, kölgəni ayrıca təbəqədə keşləyir (RepaintBoundary). Flutter 3.16+-da mövzudan (light/dark) asılı olaraq rəng və bulanıqlığı dəyişən adaptiv kölgələrlə Material 3 elevation dəstəyi əlavə edilmişdir.

Tez-tez verilən suallar

Elevation kölgədən nə ilə fərqlənir?

Elevation — elementin Z koordinatındakı ədədi hündürlüyü, shadow (kölgə) isə bu hündürlük tərəfindən yaradılan vizual effektdir. Android-də elevation — avtomatik olaraq kölgə yaradan View xüsusiyyətidir. Dizaynda elevation və shadow tez-tez bir-birini əvəz edən terminlər kimi istifadə olunur, lakin texniki olaraq elevation səbəb, shadow isə nəticədir.

Niyə Android-də kölgə göstərilmir?

Yoxlayın: (1) View-də elevation 0-dan böyük təyin edilib, (2) outlineProvider təyin edilib (View Material kitabxanasından deyilsə), (3) aparat sürətləndirilməsi aktivdir (manifestdə android:hardwareAccelerated="true"). CardView outlineProvider-ı avtomatik idarə edir. Fərdi View-lər üçün view.outlineProvider = ViewOutlineProvider.BACKGROUND çağırın.

iOS-da daxili kölgə (inner shadow) necə etmək olar?

CALayer birbaşa daxili kölgələri dəstəkləmir. Kombinasiyadan istifadə edin: mask daxilində qara rəng və şəffaflıqla CAGradientLayer və ya raster daxili kölgə ilə UIImageView qoyun. SwiftUI-da daxili kölgə overlay ilə LinearGradient və blendMode(.multiply) vasitəsilə həyata keçirilir.

Düyməyə basarkən kölgəni necə animasiya etmək olar?

Android-də animasiya üçün translationZ istifadə edin: sakit vəziyyətdə elevation = 2 dp, basarkən translationZ = 4 dp (ümumi hündürlük 6 dp). iOS-da shadowOffset və shadowRadius-ı düymənin transformasiyası ilə eyni vaxtda animasiya edin. SwiftUI-da withAnimation ilə Modifier.shadow() vasitəsilə elevation dəyişikliyindən istifadə edin. Flutter-da — BoxShadow dəyişikliyi ilə AnimatedContainer.

Bir ekranda neçə kölgə istifadə etmək olar?

Material Design bir ekranda üç səviyyədən çox elevation tövsiyə etmir. Kölgəli elementlər daha çoxdursa — onları eyni hündürlükdə qruplara birləşdirin. Həddindən artıq kölgə sayı vizual səs-küy yaradır və orta və büdcə seqmenti cihazlarda render məhsuldarlığını azaldır.

Nəticə

  • Kölgə (shadow) — elementin Z koordinatında elevation-na əsaslanan vizual dərinlik effektidir.
  • iOS-da kölgələr CALayer vasitəsilə konfiqurasiya olunur: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android-də kölgələr elevation və fərdi forma üçün OutlineProvider vasitəsilə idarə olunur.
  • Material Design beş elevation səviyyəsi müəyyən edir: 0, 1–4, 6–12, 16–24 və 24+ dp.
  • Jetpack Compose kölgələri idarə etmək üçün Modifier.shadow() və Card/Surface-də elevation istifadə edir.
  • Flutter kölgələri BoxShadow (BoxDecoration) və PhysicalModel (fiziki kölgə) vasitəsilə həyata keçirir.
  • Optimallaşdırma: shadowPath (iOS), outlineProvider (Android) təyin edin, PhysicalModel (Flutter) istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun