大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android 开发字体的大小需要用google提供的sp单位,而控件的大小需要使用dip 或者dp。
目前创新互联已为近1000家的企业提供了网站建设、域名、网页空间、网站托管维护、企业网站设计、沈河网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1. dp(或者dip device independent pixels)一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px。不同设备有不同的显示效果,这个和设备硬件有关。
2. sp(Scaled Pixels)主要用于字体显示,与刻度无关的一种像素,与dp类似,但是可以根据用户的字体大小首选项进行缩放。
3. xp即像素,1px代表屏幕上一个物理的像素点,px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同。
最近做 Android 项目的设计方案为 iphone 的,直接那里就用到 android 上,为了保持一致性并且适应到各种屏幕尺寸上,所以安装 pt 第三方库,可以将尺寸支持 pt 同时兼容各种屏幕。不过因为 pt 所以在 design 视图因为 pt 的原因而无法正确地预览视图,进行调整和布局视图。所以自己写了一个脚本将 dimens.xml 中的 pt 单位切换为 dp 便于可视化开发。发布后在切换为 pt。
脚本开始用 nodejs 写的,虽然可以实现但是和 Android 项目兼容不算好。所以决定用 gradle 写个任务。大家可以参考,不是最终版本。
版本 1.0.0
检查文件是否存在 dimens.dp.xml
如果存在则删除 dimens.dp.xml 文件
如果不存在新建一个 dimens.dp.xml 文件
逐行读取 dimens.xml 文件
判断此行是否 dimen 标签
通过正则表达式获取 pt 数值
将 pt 数值转换为对应的 dp 数值
将 pt 单位替换为 dp 数值
替换后的行写入 dimens.dp.xml 文件
将 dimens 文件修改名称为 dimens.pt.xml
将 dimens.dp.copy.xml 复制一份
将复制出的 dimens.dp.copy.xml 修改 dimens.xml
先看下TypedValue.appplyDimension的源码
[mw_shl_code=java,true]public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}[/mw_shl_code]
从代码中可以看到pt转px和sp转px的方法,所以转换成px再转成sp就可以了,可以自己写个方法一次转换啦:
[mw_shl_code=java,true]value * metrics.xdpi * (1.0f/72) / metrics.scaledDensity = value * metrics.xdpi * (1.0f/(72 * metrics.scaledDensity);[/mw_shl_code]
不然先算出px再从px算pt的话有两次精度损失。