Shadow: özü, mobil uygulamalarda gölge oluşturma

Yazar: IT Sectr Yayınlanma: 2026-02-28 Okuma süresi: 9 dk

Shadow (gölge) — mobil arayüzlerde öğeler arasında derinlik ve hiyerarşi yanılsaması yaratan görsel bir efekt. Gölgeler, hangi öğenin z düzleminde daha yüksekte olduğunu ve dolayısıyla daha önemli veya etkileşimli olduğunu gösterir. Material Design Guidelines'a (Google, 2026) göre, sistem gölgeleri beş temel yükseklik (elevation) kullanır: 0 dp (düz), 1–4 dp (düğmeler), 6–12 dp (kartlar), 16–24 dp (diyaloglar), 24+ dp (modal pencereler). Öğe yüksekliği hakkında daha fazla bilgi için Elevation makalesine bakın.

Önemli Noktalar

  • Gölge (shadow) — kenarlarda bulanıklık ile bir öğenin altındaki alanı karartarak derinlik yaratan görsel bir efekt.
  • iOS'ta gölgeler CALayer özellikleri ile ayarlanır: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android'de gölgeler elevation (Material Design) veya OutlineProvider aracılığıyla özel oluşturma ile yönetilir.
  • Jetpack Compose, Modifier.shadow() ve Card/Surface'de elevation aracılığıyla gölgeleri destekler.
  • Flutter'da gölgeler, BoxDecoration içindeki BoxShadow veya PhysicalModel aracılığıyla uygulanır.

Kullanıcı Arayüzünde Gölge Nedir?

Gölge (shadow), kullanıcı arayüzlerinde aydınlatma ve derinliği simüle eden görsel bir efekt. Bir öğenin koyu, bulanık bir kopyasının orijinalden kaydırılarak çizilmesiyle gölge oluşturulur. Mobil tasarımda gölgeler üç işlevi yerine getirir: hiyerarşiyi gösterir (yüksek öğe = uzun gölge), etkileşimi bildirir (gölgeli düğmeler basılabilir görünür), içeriği arka plandan ayırır (gölgeli kartlar ayrı bloklar olarak okunur).

Google'ın Material Design'ında gölgeler, elevation kavramıyla ayrılmaz bir şekilde bağlantılıdır. Her öğe z koordinatında belirli bir yükseklik kaplar ve gölge, üstten aydınlatmanın bir izdüşümüdür. Apple'ın Human Interface Guidelines'ı katı bir yükseklik sistemi belirtmez, ancak arayüzlerde görsel hiyerarşi ve derinlik oluşturmak için gölgelerin kullanılmasını önerir.

Nielsen Norman Group araştırmasına (2024) göre, doğru yerleştirilmiş gölgeler etkileşimli bir öğeyi bulma süresini %24 azaltır. Gölgeler ayrıca görme engelli kullanıcıların öğe sınırlarını ayırt etmesine yardımcı olur. Ancak, aşırı gölge kullanımı (ekranda 3+ seviye) bilişsel yükü artırır ve algıyı bozar.

iOS'ta Gölgeler: CALayer ve SwiftUI

iOS'ta, gölgeler CALayer özellikleri aracılığıyla uygulanır: shadowColor gölge rengini ayarlar, shadowOffset — CGSize cinsinden kaydırma (x, y), shadowRadius — bulanıklık yarıçapı, shadowOpacity — 0 ile 1 arasında opaklık. Performans için, Core Animation'ın otomatik olarak hesaplamaması için shadowPath (gölge şeklini tanımlayan bir UIBezierPath) ayarlanması da önerilir.

swift
// UIKit: CALayer ile gölge yapılandırması
import UIKit

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

// Gölge yapılandırması
cardView.layer.shadowColor = UIColor.black.cgColor
cardView.layer.shadowOpacity = 0.15
cardView.layer.shadowOffset = CGSize(width: 0, height: 4)
cardView.layer.shadowRadius = 8

"> Optimizasyon: açık shadowPath
cardView.layer.shadowPath = UIBezierPath(
    roundedRect: cardView.bounds,
    cornerRadius: 12
).cgPath

SwiftUI'da gölgeler, .shadow() değiştiricisi ile color, radius, x, y parametreleriyle ayarlanır. SwiftUI otomatik olarak shadowPath uygular ve oluşturma performansını yönetir. Gelişmiş gölgeler (iç gölgeler, birden çok gölge) için LinearGradient ile overlay() kullanın.

swift
// SwiftUI: shadow değiştiricisi ile gölge
import SwiftUI

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

iOS'ta gölge performansı: shadowPath ayarlanmazsa, Core Animation her karede katmanın şekline göre gölgeyi hesaplar ve bu da animasyon sırasında gecikmelere neden olabilir. Statik öğeler için her zaman shadowPath ayarlayın. Animasyonlu öğeler için, gölgeyi ayrı bir katmanda önbelleğe almak üzere CALayer'da shouldRasterize = true kullanın. SwiftUI'da rasterleştirme .drawingGroup() aracılığıyla yönetilir.

Android'de Gölgeler: elevation ve özel gölgeler

Android'de, Material Design'daki gölgeler elevation (öğenin z koordinatındaki yüksekliğini ayarlayan bir View özelliği) aracılığıyla uygulanır. Sistem, elevation ve outlineProvider (öğe anahattı) temelinde otomatik olarak bir gölge oluşturur. Elevation ne kadar yüksekse, gölge o kadar büyük ve bulanık olur. Material Design'dan miras almayan View'ler (örneğin AppCompat) için gölgeler yalnızca donanım hızlandırması etkinleştirildiğinde çalışır.

xml
<!-- XML: özniteliklerle 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 içeriği -->
</androidx.cardview.widget.CardView>

Android View Sisteminde özel gölgeler için OutlineProvider kullanın. ViewOutlineProvider, outline.setRoundRect() veya outline.setPath() aracılığıyla isteğe bağlı bir şekil ayarlamanıza olanak tanır. OutlineProvider olmadan gölge, View'in dikdörtgen şekline göre oluşturulur ve köşe yuvarlaması dikkate alınmaz.

kotlin
// Kotlin: gölge için özel 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öşe yarıçapı
        )
    }
}
myView.elevation = 8f  // px cinsinden gölge yüksekliği
myView.translationZ = 4f  // basıldığında ek yükseklik

Jetpack Compose'ta gölgeler, Modifier.shadow() ve Card ile Surface bileşenlerindeki elevation aracılığıyla yönetilir. Modifier.shadow() elevation ve shape kabul eder. View Sisteminin aksine, Compose gölgeleri kendi oluşturma hattında oluşturur ve bu da tüm Android sürümlerinde daha öngörülebilir bir davranış sağlar.

kotlin
// Jetpack Compose: Modifier.shadow ile gölge
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("Özel gölgeli Card")
}

Gölge Kullanımı İçin Öneriler

Gölgelerin doğru kullanımı arayüz algısını iyileştirirken, yanlış kullanım görsel gürültü oluşturur ve performansı düşürür. Material Design beş elevation seviyesi tanımlar: 0 dp (gölge yok), 1–4 dp (düğmeler, çipler), 6–12 dp (kartlar, menüler), 16–24 dp (diyaloglar, alt sayfalar), 24+ dp (modal pencereler, FAB).

SeviyeElevationÖğelerGölge Özelliği
00 dpMetin, simgeler, arka planGölge yok, düz katman
11–4 dpDüğmeler, giriş alanlarıHafif gölge, küçük kaydırma
26–12 dpKartlar, SnackbarOrta gölge, belirgin bulanıklık
316–24 dpDiyaloglar, menülerDerin gölge, büyük bulanıklık
424+ dpModal pencerelerMaksimum gölge, öğe yüzer

En iyi uygulamalar: (1) dikkat çekmemesi gereken öğeler (arka planlar, ayırıcılar) için gölge kullanmayın, (2) gölge yüksekliği öğe önemiyle eşleşmelidir — ne kadar önemliyse o kadar yüksek, (3) bir düğmeye basıldığında, dokunsal geri bildirim için animasyonla elevation azaltın, (4) koyu arka planlarda gölgelerden kaçının — gölge yerine overlay (aydınlatma/karartma) kullanın. Material You'da (Android 12+), gölgeler temaya uyum sağlar: koyu arka planda elevation, bir renk katmanı (surface tint) ile değiştirilir.

Flutter'da Gölgeler: BoxShadow ve PhysicalModel

Flutter'da, gölgeler BoxDecoration içindeki BoxShadow aracılığıyla uygulanır. BoxShadow, color, offset, blurRadius ve spreadRadius kabul eder. Flutter birden çok gölgeyi destekler: BoxShadow listesi iletilmesi, karmaşık efektler (örneğin, dış gölge + iç vurgu) oluşturulmasına olanak tanır. PhysicalModel, şekle (BeveledRectangleBorder, CircleBorder) dayalı fiziksel bir gölge simüle eden bir alternatiftir.

dart
// Flutter: BoxDecoration + BoxShadow ile gölge
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('Gölgeli kap'),
)

// Fiziksel gölge için PhysicalModel
PhysicalModel(
    color: Colors.white,
    elevation: 6.0,
    shadowColor: Colors.black.withOpacity(0.2),
    borderRadius: BorderRadius.circular(12.0),
    child: Text('Gölgeli fiziksel model'),
)

Performans: Birden çok gölgeye sahip BoxShadow, her değişiklikte yeniden boyamaya neden olabilir. Statik öğeler için PhysicalModel kullanın — gölgeyi ayrı bir katmanda (RepaintBoundary) önbelleğe alır. Flutter 3.16+'da, temaya (açık/koyu) bağlı olarak renk ve bulanıklığı değiştiren uyarlanabilir gölgelere sahip Material 3 elevation desteklenir.

Sıkça Sorulan Sorular

Elevation, shadow'dan nasıl farklıdır?

Elevation, bir öğenin z koordinatındaki sayısal yüksekliğidir, shadow (gölge) ise bu yükseklik tarafından oluşturulan görsel etkidir. Android'de elevation, otomatik olarak gölge oluşturan bir View özelliğidir. Tasarımda elevation ve shadow sıklıkla birbirinin yerine kullanılır, ancak teknik olarak elevation nedendir ve shadow sonuçtur.

Android'de gölge neden görüntülenmiyor?

Şunları kontrol edin: (1) View'de elevation 0'dan büyük ayarlanmış, (2) outlineProvider ayarlanmış (View Material kitaplığından değilse), (3) donanım hızlandırması etkin (manifest'te android:hardwareAccelerated="true"). CardView, outlineProvider'ı otomatik olarak yönetir. Özel View'ler için view.outlineProvider = ViewOutlineProvider.BACKGROUND çağrısını yapın.

iOS'ta iç gölge (inner shadow) nasıl oluşturulur?

CALayer, iç gölgeleri doğrudan desteklemez. Bir maske içinde siyah renk ve şeffaflık ile CAGradientLayer kullanın veya raster iç gölgeye sahip bir UIImageView yerleştirin. SwiftUI'da iç gölge, LinearGradient ve blendMode(.multiply) ile overlay aracılığıyla uygulanır.

Bir düğmeye basıldığında gölge nasıl canlandırılır?

Android'de animasyon için translationZ kullanın: hareketsiz durumda elevation = 2 dp, basıldığında translationZ = 4 dp (toplam yükseklik 6 dp). iOS'ta, düğme dönüşümüyle eşzamanlı olarak shadowOffset ve shadowRadius'ı canlandırın. SwiftUI'da, Modifier.shadow() aracılığıyla elevation değişikliğiyle withAnimation kullanın. Flutter'da BoxShadow değişikliğiyle AnimatedContainer kullanın.

Bir ekranda kaç gölge kullanılabilir?

Material Design, bir ekranda üçten fazla elevation seviyesi önermez. Gölgeli daha fazla öğe varsa, bunları aynı yükseklikte gruplandırın. Aşırı gölge sayısı görsel gürültü oluşturur ve orta ve bütçe segmenti cihazlarda oluşturma performansını düşürür.

Özet

  • Gölge (shadow), z koordinatındaki öğe elevation'ına dayalı görsel bir derinlik efektidir.
  • iOS'ta gölgeler CALayer ile yapılandırılır: shadowColor, shadowOffset, shadowRadius, shadowOpacity.
  • Android'de gölgeler elevation ve özel şekil için OutlineProvider ile yönetilir.
  • Material Design beş elevation seviyesi tanımlar: 0, 1–4, 6–12, 16–24 ve 24+ dp.
  • Jetpack Compose, gölge yönetimi için Card/Surface'de Modifier.shadow() ve elevation kullanır.
  • Flutter, gölgeleri BoxShadow (BoxDecoration) ve PhysicalModel (fiziksel gölge) ile uygular.
  • Optimizasyon: shadowPath ayarlayın (iOS), outlineProvider (Android), PhysicalModel kullanın (Flutter).

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun