dimen.xml 必须用 dp(字体用 sp),禁用 px;无需为各密度建多套 values-xxx/ 目录,一套 dp 即可适配;限定符优先用 swdp 而非 wdp;constraintlayout 应多用百分比和约束,少用固定 dimen。

dimen.xml 里写 dp 还是 px?
Android 的 dimen.xml 必须用 dp(或 sp),不能直接写 px。系统在运行时靠密度无关像素(dp)自动换算成对应屏幕的物理像素,写死 px 会导致在高密度屏上元素过小、低密度屏上糊成一片。
-
dp是唯一推荐单位,适配逻辑由系统完成 -
sp仅用于字体大小,会随用户系统字号设置缩放 - 写
px等于放弃适配,连values-hdpi/这类限定目录都救不回来 - 错误示例:
<dimen name="item_height">80px</dimen>→ 实际渲染严重偏小
要不要为每种屏幕密度建一套 values-xxx/ 目录?
不需要,绝大多数项目只需维护一套 values/dimens.xml,用 dp + 系统自动缩放即可覆盖主流设备。手动拆分 values-mdpi/、values-xhdpi/ 等目录,反而容易漏配、难维护、增大包体积。
- 系统对
dp的换算精度足够(1 dp = 1 px @ mdpi,1.5 px @ hdpi,2 px @ xhdpi…) - 只有极少数场景需微调:比如某控件在 xxhdpi 上因图标间隙太紧必须加 2dp,才考虑
values-xxhdpi/dimens.xml单独覆盖 - 多套 dimen 文件会让设计师改个间距就得同步改 5 个文件,出错率陡增
sw600dp 和 w820dp 这类限定符怎么选?
优先用 sw<n>dp</n>(smallest width),它看的是屏幕可用宽度最小值,不受横竖屏切换影响,语义清晰、行为稳定;w<n>dp</n>(available width)会在横竖屏时来回跳,容易导致布局闪动或资源加载错乱。
-
sw600dp:平板通用门槛,涵盖 Nexus 7、iPad mini 等主流中屏设备 -
sw720dp:大平板或折叠屏展开态,适合独立侧边栏布局 - 避免用
large、xlarge这类抽象尺寸限定符,API 26+ 已被标记为 deprecated - 示例:想让横屏手机也显示双栏,别用
w720dp,改用sw600dp+ 在代码中判断 orientation
用 ConstraintLayout 还需要写大量 dimen 吗?
不需要。现代布局应尽量用约束比例(app:layout_constraintWidth_percent)、链式分布(chainStyle)、权重(app:layout_constrainedWidth="true" + app:layout_constraintHorizontal_weight)替代固定 dp 值。
- 固定
dp值越多,适配越脆弱;百分比和约束能自适应不同宽高比 - 保留 dimen 仅用于「不可压缩的最小尺寸」:如按钮最小高度
48dp、图标安全边距16dp - 错误做法:给每个
TextView的layout_width都设@dimen/text_width→ 一换屏就溢出或留白过大
真正麻烦的不是写多少 dimen,而是把本该由 ConstraintLayout 解决的弹性问题,硬塞进静态尺寸里——那等于自己造坑再跳。










