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) การปัดมุมถูกจำแนกเป็นสามระดับ: เล็ก (4 dp) สำหรับปุ่มและฟิลด์ป้อนข้อมูล กลาง (8–12 dp) สำหรับการ์ดและชีต ใหญ่ (16–28 dp) สำหรับไดอะล็อกและบอททอมชีต Apple HIG (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("Corner Radius 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 ต่างจากรัศมีแบบคลาสสิก (วงกลม) รัศมีต่อเนื่องสร้างการปัดมุมที่นุ่มนวลกว่าโดยใช้เส้นโค้ง Bezier อันดับสามแทนส่วนโค้งของวงกลม SwiftUI รองรับสไตล์นี้ผ่านพารามิเตอร์ style: .continuous ใน RoundedRectangle Apple แนะนำ continuous corner radius สำหรับองค์ประกอบระบบทั้งหมดเนื่องจากดูเป็นธรรมชาติมากกว่า
บน Android การปัดมุมถูกใช้งานแบบดั้งเดิมผ่านทรัพยากร XML shape ในโฟลเดอร์ res/drawable Shape กำหนดรูปร่างพื้นหลังด้วยพารามิเตอร์ cornerRadius และ solid สำหรับมุมต่าง ๆ ใช้ <corners android:bottomLeftRadius="..." /> ใน 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 = "Card ที่มีการปัดมุมแบบกำหนดเอง")
}
MaterialShapeDrawable ในระบบ View ของ Android อนุญาตให้เปลี่ยน corner radius แบบไดนามิกโดยไม่ต้องสร้าง drawable ใหม่ ใช้ ShapeAppearanceModel สำหรับการกำหนดค่าที่แม่นยำ: ตั้งค่า cornerFamily (rounded หรือ cut) และ cornerSize สำหรับแต่ละมุมแยกกัน
การเลือก corner radius ขึ้นอยู่กับประเภทขององค์ประกอบ บริบทการใช้งาน และแพลตฟอร์ม ไม่มีกฎสากล แต่ Material Design และ Apple HIG ให้คำแนะนำที่ชัดเจนสำหรับส่วนประกอบมาตรฐาน หลักการสำคัญ: การปัดมุมควรสังเกตเห็นได้แต่ไม่ควรรบกวนเนื้อหา
| ประเภทองค์ประกอบ | 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() วิดเจ็ต 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 ใช้เมื่อคุณต้องการตัดภาพหรือวิดเจ็ตที่ซับซ้อนตามขอบโค้งมน สำหรับคอนเทนเนอร์พื้นหลังแบบง่าย 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 คือสไตล์การปัดมุมที่มุมถูกสร้างขึ้นไม่ใช่โดยส่วนโค้งของวงกลม แต่โดยเส้นโค้ง Bezier อันดับสาม Apple ใช้สไตล์นี้ตั้งแต่ iOS 7 สำหรับองค์ประกอบระบบทั้งหมด ในทางสายตา การปัดมุมต่อเนื่องดูนุ่มนวลและเป็นธรรมชาติมากกว่าเมื่อเทียบกับสไตล์วงกลมแบบคลาสสิก
แนะนำ 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 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ