iOS 标注稿转安卓
设计师交付了 375pt 的 iOS 标注稿,安卓开发需要 360dp。手动换算每个元素尺寸,20 个页面算了 3 小时,还漏标了 3 处间距。用本工具输入标准 DPI(iOS @2x → 安卓 mdpi),批量把 pt 值转成 dp,误差控制在 0.5px 以内。以前半天的工作量,现在 10 分钟对完所有标注。
设计师在 Sketch 里标注的 16sp,开发在 2.75x 屏上量出来可能是 44pt。这个工具把 dp、sp、pt、px 和不同 DPI 之间的换算拆成一组选择器:选好源单位与目标单位,填数值即出结果。所有运算在浏览器内完成,不向服务端发送任何输入值——适合在 Sketch 与 Android Studio 之间来回切屏时快速核对标注。
设计师交付了 375pt 的 iOS 标注稿,安卓开发需要 360dp。手动换算每个元素尺寸,20 个页面算了 3 小时,还漏标了 3 处间距。用本工具输入标准 DPI(iOS @2x → 安卓 mdpi),批量把 pt 值转成 dp,误差控制在 0.5px 以内。以前半天的工作量,现在 10 分钟对完所有标注。
设计稿给的是 750px 宽度(@2x),前端要写 rem 或 vw,但不同手机 DPR 不一样。以前靠心算比例,结果在 iPhone 12 上按钮正常,在红米 Note 上文字溢出。用本工具输入设计稿 px 值,分别算出 320/375/414/428 四种视口下的对应 px,直接写进媒体查询,上线后未收到适配投诉。
客户给了 300dpi 的印刷 PDF,要放到商场 4K 竖屏播放。把 PDF 里的 sp 字号直接转成 4K 屏的 px,结果文字在屏上只有指甲盖大。用本工具输入原稿 DPI(300)和目标屏 DPI(163),算出 sp 与 px 的换算系数,把正文从 12sp 调成 28px,播放时清晰度与印刷样一致。
设计稿用 750px 画布(@2x),微信小程序使用 rpx(基于 750 物理宽度)。但设计师给的 sp 字号在 iOS 和安卓上显示大小不同。用本工具把 sp 值分别转成 iOS 和安卓的对应 px,再统一换算成 rpx,确保两端字号视觉一致。避免了上架后被投诉 iOS 字小、安卓字大的问题。
老项目用 px 写死,新框架要求全部用 dp/sp。手动改 200 个文件,每改一个要算一遍 DPI 比例。用本工具输入原 px 值和原 DPI(320dpi),批量输出对应 dp 值,sp 字号同理。迁移后页面在低端机上不再出现按钮错位,且字号随系统字体缩放。
| 维度 | 本工具 | 竞品 A(在线转换站) | 传统方法(手动计算) |
|---|---|---|---|
| 隐私 | 所有单位转换在浏览器本地完成,不上传任何数值 | 需将 dp/sp/pt/px 数值上传至服务器处理 | 完全离线,无隐私风险 |
| 速度 | 输入即出结果,无网络延迟 | 需等待上传 + 服务器响应,受网速影响 | 需手动查公式、计算器逐项换算,耗时数分钟 |
| 离线可用 | 完全离线,无网络也可使用 | 必须联网,断网无法访问 | 完全离线,依赖纸笔或计算器 |
| DPI 适配 | 支持自定义 DPI(如 160/320/480),适配不同屏幕 | 通常只固定 160/320 DPI,不支持自定义 | 需自行查找不同 DPI 的换算系数,容易出错 |
| 多单位互转 | 一次输入支持 dp/sp/pt/px 任意两者互转 | 多数只支持 dp ↔ px 或 sp ↔ px,需多次操作 | 需分别记忆不同单位间的换算公式,反复计算 |
| 学习成本 | 打开即用,无需理解换算原理 | 需理解单位含义并选择正确转换方向 | 需掌握 dp/sp/pt/px 定义及 DPI 换算公式 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 16sp(Android 基准密度 mdpi,目标密度 xxhdpi,单位 px) | 48px | 常规:sp 在 mdpi 下 1sp=1px,xxhdpi 为 3x 密度,16×3=48px,验证基础缩放逻辑 |
| 10dp(Android 基准密度 mdpi,目标密度 xhdpi,单位 px) | 20px | 常规:dp 与 px 在 mdpi 下 1:1,xhdpi 为 2x,10×2=20px,覆盖 dp 到 px 典型场景 |
| 1pt(标准 72pt/inch,目标密度 326ppi(iPhone 6/6s/7/8),单位 px) | 4.53px | 边界:pt 是物理单位(1/72 英寸),在 326ppi 屏幕下 1pt=326/72≈4.53px,验证 pt 与 px 的物理换算 |
| 0px(源单位 px,目标单位 dp,目标密度 hdpi) | 0dp | 边界:零值输入,验证工具不会因除零或空值报错,且输出明确为 0 |
| 1dp(Android 基准密度 mdpi,目标密度 ldpi,单位 px) | 0.75px | 边界:ldpi 为 0.75x 密度,1dp 在 mdpi 下为 1px,转换到 ldpi 需按比例缩小,验证低密度缩放 |
| 16sp(Android 基准密度 mdpi,目标密度 xxxhdpi,单位 px) | 64px | 易错:xxxhdpi 为 4x 密度,16×4=64px,但部分工具可能误用 3.5x 或 4.5x,暴露密度因子选择差异 |
| 12pt(标准 72pt/inch,目标密度 160ppi(mdpi),单位 px) | 26.67px | 易错:pt 转 px 需同时考虑 pt 的物理定义(1pt=1/72 英寸)和屏幕 ppi,160ppi 下 12pt=12×(160/72)≈26.67px,验证 pt 与 dp 类单位的计算差异 |
1.混淆 sp 与 dp 的缩放基准
输入 16sp,期望在 320dpi 屏幕上得到 16px,直接当 dp 用sp 用于字体:16sp × 2(320dpi 缩放比)= 32px;dp 用于布局:16dp × 2 = 32pxsp 和 dp 在相同 DPI 下物理像素相同,但 sp 会跟随系统字体缩放设置,dp 固定不变。Android 文档明确区分两者用途。
2.忽略 DPI 缩放因子计算方式
在 320dpi 屏幕上,认为 1dp = 320/160 = 2px,直接写 1dp = 2px320dpi 对应 density=2(mdpi=160 为基准),1dp = 2px 正确,但需注意非整数 DPI 如 213dpi 时 density=1.33,实际 px = dp × 1.33Android 用 density = dpi / 160 计算缩放比,非整数 density 在布局中可能产生子像素舍入误差,UI 测试需在真机不同 DPI 下验证。
3.pt 与 dp 混用,误以为 1pt=1dp
设计稿标注 12pt,开发时直接写 12dp1pt = 1/72 英寸,1dp ≈ 1/160 英寸(mdpi),所以 12pt ≈ 12 × (160/72) ≈ 26.67dppt 是物理尺寸单位(1/72 英寸),dp 是密度无关像素(1/160 英寸),两者物理长度不同,混用会导致跨设备显示偏差。
4.px 转 dp 时忘记除以 density
设计稿宽度 1080px(xxhdpi,density=3),直接写 width=1080dpdp = px / density = 1080 / 3 = 360dppx 转 dp 必须除以设备 density,否则在低 DPI 设备上布局会溢出屏幕。xxhdpi 的 density=3,1080px 对应 360dp。
5.sp 转 px 时忽略用户字体缩放
用固定公式 sp × density = px,认为结果对所有人一致sp 转 px 需乘以系统字体缩放比例:px = sp × density × fontScale;fontScale 默认 1.0,用户可调至 1.3 等Android 系统设置中字体大小可独立缩放,sp 必须考虑 fontScale 因子,否则对大字用户可能显示不全或溢出。
6.输入非标准 DPI 值时误用整数近似
输入 213dpi(tvdpi),直接取 density=1.5(240dpi 对应值)213dpi 的 density = 213/160 ≈ 1.33125,px = dp × 1.33125非标准 DPI(如 tvdpi=213、ldpi=120)的 density 不是整数,四舍五入会导致布局偏差,应使用精确浮点数计算。
7.混淆 px 与 dp 在 Web 与 Android 的差异
将 Web CSS 中的 px(1px=1/96英寸)直接当作 Android px 使用Android px 是物理像素,CSS px 是参考像素(1/96英寸),两者无直接换算关系;应通过 DPI 换算:Android px = CSS px × (设备 dpi / 96)Web 的 CSS px 是抽象单位(1/96英寸),Android 的 px 是屏幕物理像素,跨平台转换必须引入设备 DPI 参数。
px = dp × (dpi / 160)
px屏幕物理像素,单位 pxdp密度无关像素,单位 dpdpi屏幕每英寸像素数,如 320设计稿标注 160 dp,在 320 dpi 的屏幕上:px = 160 × (320 / 160) = 160 × 2 = 320 px,即实际渲染宽度为 320 像素。
5 种主流语言实现,复制即用:
import math
def dp_to_px(dp: float, dpi: float = 160) -> float:
"""dp 转 px,基于 dpi(默认 160 = mdpi)"""
return dp * (dpi / 160)
def px_to_dp(px: float, dpi: float = 160) -> float:
"""px 转 dp"""
return px / (dpi / 160)
def pt_to_px(pt: float, dpi: float = 72) -> float:
"""pt 转 px,默认 1pt = 1px @72dpi"""
return pt * (dpi / 72)
def sp_to_px(sp: float, font_scale: float = 1.0, dpi: float = 160) -> float:
"""sp 转 px,考虑用户字体缩放(默认 1.0)"""
dp = sp * font_scale
return dp_to_px(dp, dpi)
# 示例:在 320dpi(xhdpi)下,16dp = ? px
print(dp_to_px(16, 320)) # 32.0
# 示例:12pt @96dpi = ? px
print(pt_to_px(12, 96)) # 16.0/**
* dp → px(基于设备 dpi)
* @param {number} dp
* @param {number} dpi - 设备像素密度,默认 160(mdpi)
* @returns {number}
*/
function dpToPx(dp, dpi = 160) {
return dp * (dpi / 160);
}
/** px → dp */
function pxToDp(px, dpi = 160) {
return px / (dpi / 160);
}
/** pt → px(1pt = 1px @72dpi) */
function ptToPx(pt, dpi = 72) {
return pt * (dpi / 72);
}
/** sp → px(考虑字体缩放) */
function spToPx(sp, fontScale = 1.0, dpi = 160) {
return dpToPx(sp * fontScale, dpi);
}
// 示例
console.log(dpToPx(16, 320)); // 32
console.log(ptToPx(12, 96)); // 16package main
import "fmt"
// dpToPx 将 dp 转换为 px,dpi 默认 160(mdpi)
func dpToPx(dp float64, dpi float64) float64 {
return dp * (dpi / 160)
}
// pxToDp 将 px 转换为 dp
func pxToDp(px float64, dpi float64) float64 {
return px / (dpi / 160)
}
// ptToPx 将 pt 转换为 px(1pt = 1px @72dpi)
func ptToPx(pt float64, dpi float64) float64 {
return pt * (dpi / 72)
}
// spToPx 将 sp 转换为 px,考虑字体缩放
func spToPx(sp float64, fontScale float64, dpi float64) float64 {
dp := sp * fontScale
return dpToPx(dp, dpi)
}
func main() {
fmt.Println(dpToPx(16, 320)) // 32
fmt.Println(ptToPx(12, 96)) // 16
}/** dp → px,默认 dpi=160(mdpi) */
export function dpToPx(dp: number, dpi: number = 160): number {
return dp * (dpi / 160);
}
/** px → dp */
export function pxToDp(px: number, dpi: number = 160): number {
return px / (dpi / 160);
}
/** pt → px(1pt = 1px @72dpi) */
export function ptToPx(pt: number, dpi: number = 72): number {
return pt * (dpi / 72);
}
/** sp → px,考虑字体缩放 */
export function spToPx(sp: number, fontScale: number = 1.0, dpi: number = 160): number {
return dpToPx(sp * fontScale, dpi);
}
// 示例
console.log(dpToPx(16, 320)); // 32
console.log(ptToPx(12, 96)); // 16#!/bin/bash
# dp 转 px(基于 dpi,默认 160)
dp_to_px() {
local dp=$1
local dpi=${2:-160}
echo "scale=4; $dp * ($dpi / 160)" | bc
}
# px 转 dp
px_to_dp() {
local px=$1
local dpi=${2:-160}
echo "scale=4; $px / ($dpi / 160)" | bc
}
# pt 转 px(默认 72dpi)
pt_to_px() {
local pt=$1
local dpi=${2:-72}
echo "scale=4; $pt * ($dpi / 72)" | bc
}
# 示例
dp_to_px 16 320 # 32.0000
pt_to_px 12 96 # 16.0000直接使用本工具的 px → dp 转换。需要先设置目标设备的 DPI(一般在 160-640 之间,主流手机在 320-480),输入 px 值后工具会自动算出对应 dp。注意 px 和 dp 不是固定比例,同一 px 在不同 DPI 设备上对应的 dp 不同。开发通常以 160 DPI 为基准,所以 1dp ≈ 1px(160 DPI 时),在 320 DPI 设备上 1dp = 2px。
dp 是密度无关像素,用于布局尺寸(宽高、间距、边距),不随系统字体缩放变化。sp 是缩放无关像素,专用于字体大小,会跟随用户系统字体设置缩放。本工具支持 sp 与 dp 互转,但转换时默认按 1:1(即 1sp = 1dp 基准),因为实际比例取决于用户系统字体缩放倍数。建议:布局用 dp,文字用 sp。
完全正常。px、dp、sp、pt 这些单位之间的换算涉及不同 DPI 基准(160、72 等),结果通常是小数。例如 50px 在 326 DPI(iPhone 6)下转 dp 是 50 ÷ (326/160) ≈ 24.54dp。开发中建议直接使用小数,或按设计规范四舍五入到 0.5 的倍数。本工具结果保留 2 位小数,足够精确。
支持任意正整数 DPI,从低端屏(120 DPI)到高分屏(640+ DPI)都能算。2K 屏常见 DPI 在 300-500 之间(如 27 寸 2560×1440 约 109 DPI,手机 1440p 约 500+ DPI)。输入框直接填数字即可,不在下拉列表里的也能手动输入。工具按标准公式换算:目标单位值 = 源值 × (目标 DPI / 基准 DPI)。
因为 pt 的基准 DPI 不同。pt(点)是印刷单位,1pt = 1/72 英寸。本工具默认以 72 DPI 为 pt 基准(1pt = 1px 在 72 DPI 下),但部分设计软件(如 Figma)按 96 DPI 显示 pt。如果你发现结果差 1.33 倍,检查另一方工具用的基准 DPI 是否为 96。本工具结果区标注了所用基准,可对照调整。
浏览器 px 是 CSS 像素,Android dp 是密度无关像素,两者概念等价但基准不同。CSS px 基准是 96 DPI,Android dp 基准是 160 DPI。换算公式:dp = CSS px × (160 / 96) ≈ CSS px × 1.667。例如浏览器里量出 100px,对应 Android dp 约 167dp。本工具支持直接输入源 DPI 和目 DPI,把浏览器 DPI 设 96、Android 设 160 即可。
不需要上传任何文件。工具是纯前端实现(FE),所有换算在浏览器本地完成,输入的数字不会发送到任何服务器。断网也能用。适合处理未公开的设计稿或保密项目的尺寸数据。注意:手动输入的数值会在页面刷新后清空,不会本地缓存。
本工具对输入值不做正负限制,0 和负数按数学公式正常换算(如 -10px → -5.33dp),这在某些场景下有用(如负边距或反向偏移)。但如果只是想确认“0 是否有效”,答案是:能算,结果就是 0。建议输入前确认数值的物理意义,负值在设计稿中通常用于特殊定位,普通场景建议用正数。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。