Corner radius — параметър за заобляне на ъгли на UI елементи, който се измерва в логически пиксели (pt на iOS, dp на Android) и определя радиуса на окръжността, вписана в ъгъла на правоъгълника. Правилният избор на corner radius влияе върху възприемането на интерфейса: големите заобляния създават мек, приятелски тон, малките — строг и формален. Според Material Design Guidelines (Google, 2026), препоръчителният radius за карти е 8–16 dp, за бутони — 4–8 dp. Прочетете повече за управлението на външния вид на елементите в статията за сенки в UI.
Основни точки
Corner radius — числова стойност, която определя степента на заобляне на ъглите на правоъгълен елемент. Колкото по-висока е стойността, толкова по-заоблен става ъгълът. При стойност 0 ъгълът остава прав (90°), при стойност, равна на половината от по-късата страна, елементът се превръща в кръг (за квадрат) или заоблен правоъгълник с прави страни (капсула).
В мобилния дизайн corner radius се използва за: карти и плочки, бутони, полета за въвеждане, модални прозорци, изображения и аватари, индикатори за напредък, чипове и значки. Всеки тип елемент има препоръчителен диапазон на заобляне, базиран на насоките на Material Design и Human Interface Guidelines.
Според Material Design 3 (Google, 2026), заоблянето на ъгли се класифицира на три нива: small (4 dp) за бутони и полета за въвеждане, medium (8–12 dp) за карти и листове, large (16–28 dp) за диалози и bottom sheet-ове. HIG Apple (2025) препоръчва единен corner radius от 10–12 pt за системни елементи (UIButton, UITextField) и 20+ pt за модални презентации.
На iOS заоблянето на ъгли се реализира чрез свойството cornerRadius на CALayer. В UIKit всеки UIView има слой, на който може да се зададе cornerRadius. За по-сложни заобляния (различни радиуси за различни ъгли) се използват maskedCorners и CACornerMask в комбинация с UIBezierPath.
// UIKit: заобляне чрез CALayer
import UIKit
let cardView = UIView()
cardView.backgroundColor = .systemBackground
cardView.layer.cornerRadius = 12
cardView.layer.maskedCorners = [
.layerMinXMinYCorner,
.layerMaxXMinYCorner
]
В SwiftUI заоблянето се задава чрез модификатора cornerRadius() или чрез ClipShape с RoundedRectangle. SwiftUI също поддържа индивидуално заобляне на ъгли чрез UIRectCorner в комбинация с clipped() и overlay().
// SwiftUI: заобляне чрез RoundedRectangle
import SwiftUI
VStack {
Text("Радиус на ъгъла 16")
.padding()
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color.blue)
)
}
// Индивидуално заобляне на ъгли
RoundedRectangle(
cornerSize: CGSize(width: 16, height: 16),
style: .continuous
)
Continuous corner radius — стил на заобляне, използван от Apple в iOS от пускането на iOS 7. За разлика от класическия радиус (circular), continuous radius създава по-гладко заобляне чрез използване на крива на Безие от трети ред вместо дъга от окръжност. SwiftUI поддържа този стил чрез параметъра style: .continuous в RoundedRectangle. Apple препоръчва continuous corner radius за всички системни елементи като визуално по-естествен.
В Android заоблянето на ъгли традиционно се реализира чрез XML shape ресурси в папката res/drawable. Shape определя формата на фона с параметрите cornerRadius и solid. За различни ъгли се използват <, bottom, top и <right. В Material Design 3 е добавен MaterialShapeDrawable с поддръжка на теми и динамични форми.
<!-- res/drawable/bg_card.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="12dp" />
</shape>
В Jetpack Compose заоблянето се задава чрез параметъра shape в Modifier. Compose предоставя RoundedCornerShape с поддръжка на различни радиуси за всеки ъгъл и стил (CircularShape или CutCornerShape). Compose също поддържа continuous corner radius чрез RoundedCornerShape в комбинация с графичен контур.
// Jetpack Compose: заобляне чрез RoundedCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
Card(
shape = RoundedCornerShape(
topStart = 16.dp,
topEnd = 16.dp,
bottomStart = 4.dp,
bottomEnd = 4.dp
),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Text(text = "Карта с персонализирано заобляне")
}
MaterialShapeDrawable в Android View System позволява динамично променяне на corner radius без пресъздаване на drawable. Използвайте ShapeAppearanceModel за точна настройка: задайте cornerFamily (rounded или cut) и cornerSize за всеки ъгъл поотделно.
Изборът на corner radius зависи от типа на елемента, контекста на използване и платформата. Няма универсално правило, но Material Design и HIG Apple дават ясни препоръки за стандартните компоненти. Основният принцип: заоблянето трябва да е забележимо, но да не пречи на съдържанието.
| Тип елемент | Препоръчителен radius | Платформа | Забележка |
|---|---|---|---|
| Бутони | 4–8 dp / 8 pt | iOS, Android | Колкото по-голям е бутонът, толкова по-голям е radius |
| Карти | 8–16 dp / 10–12 pt | iOS, Android | Material Design: по подразбиране 12 dp |
| Полета за въвеждане | 4–8 dp / 8 pt | iOS, Android | Твърде голямото заобляне изглежда неестествено |
| Модални прозорци | 16–28 dp / 20+ pt | iOS, Android | iOS 18: по подразбиране 24 pt |
| Аватари | 50% от размера | iOS, Android | За кръгли аватари radius = половината страна |
| Чипове / Значки | 16–20 dp / 14 pt | Android | Форма на капсула при голямо заобляне |
Правило за контраст: елементите с различен corner radius в един интерфейс трябва да се различават с поне 4 dp, за да е забележима визуалната разлика. Не използвайте 3 нива на заобляне на един екран — това създава визуален шум. Material Design 3 препоръчва използването на не повече от две нива на заобляне на екран: едно за контейнери (карти, диалози) и едно за интерактивни елементи (бутони, полета).
Във Flutter заоблянето на ъгли се реализира чрез класа BorderRadius, който приема стойности Radius.circular() или Radius.elliptical(). Flutter поддържа индивидуално заобляне чрез BorderRadius.only() и BorderRadius.horizontal()/vertical(). Widget-ът ClipRRect изрязва дъщерния елемент според зададения BorderRadius.
// Flutter: заобляне чрез ClipRRect и Container
import 'package:flutter/material.dart';
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0),
bottomLeft: Radius.circular(4.0),
bottomRight: Radius.circular(4.0),
),
),
child: Text('Персонализирано заобляне на ъгли'),
)
// ClipRRect с Image
ClipRRect(
borderRadius: BorderRadius.circular(12.0),
child: Image.network(
'https://example.com/image.jpg',
fit: BoxFit.cover,
),
)
ClipRRect във Flutter се използва, когато трябва да се изреже изображение или сложен widget по заоблена граница. За прости фонови контейнери е достатъчен BoxDecoration с borderRadius — това е по-производително, тъй като не създава отделен изрязващ слой. Material Flutter 3.22+ поддържа continuous corner radius чрез ContinuousRectangleBorder.
Често задавани въпроси
dp (density-independent pixels) в Android и pt (points) в iOS — са логически единици, които съответстват на физическия размер на екрана, независимо от плътността на пикселите. 1 dp ≈ 1 pt ≈ 1/160 инча. Числовите стойности на corner radius в dp и pt могат да се използват като взаимозаменяеми при прехвърляне на дизайн между платформи.
На iOS използвайте maskedCorners с CACornerMask: layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]. В Android XML — . В Jetpack Compose — RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp). Във Flutter — BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)).
Continuous corner radius — стил на заобляне, при който ъгълът се формира не по дъга от окръжност, а по крива на Безие от трети ред. Apple използва този стил от iOS 7 за всички системни елементи. Визуално, continuous заоблянето изглежда по-гладко и естествено в сравнение с класическия circular стил.
Препоръчва се 10–12 pt на iOS (като системната клавиатура) и 8–12 dp на Android. Клавишите вътре в клавиатурата могат да имат по-малък radius (4–6 dp) или да са без заобляне. За увеличаване на допирната площ използвайте padding 4–8 dp между заоблената граница и ръба на бутона.
UITableViewCell не наследява автоматично cornerRadius от contentView, тъй като фонът на клетката се рисува в backgroundView. За заобляне на клетката задайте cornerRadius за contentView.layer и backgroundView.layer едновременно. В SwiftUI използвайте .listRowBackground() с RoundedRectangle.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също