Android系统中自带的Api中可以使用TypedValue进行单位转换

1,调用系统api转换单位

// 获得转换后的px值
float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 16,context.getResources().getDisplayMetrics());

2,分析TypedValue.applyDimension搞了什么事情?

// 在TypedValue类中
/*** px、dp、sp、pt、in、mm单位转换* @param unit  转换类型* @param value 转换值(float)* @param metrics 当前设备显示密度* @return 转换单位后的值*/
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {switch (unit) {case COMPLEX_UNIT_PX: // 转换为px(像素)值return value;case COMPLEX_UNIT_DIP: // 转换为dp(密度)值return value * metrics.density;case COMPLEX_UNIT_SP: // 转换为sp(与刻度无关的像素)值return value * metrics.scaledDensity;case COMPLEX_UNIT_PT: // 转换为pt(磅)值return value * metrics.xdpi * (1.0f / 72);case COMPLEX_UNIT_IN: // 转换为in(英寸)值return value * metrics.xdpi;case COMPLEX_UNIT_MM: // 转换为mm(毫米)值return value * metrics.xdpi * (1.0f / 25.4f);}return 0;
}

3,分析context.getResources().getDisplayMetrics()搞了什么事情

// 在Resource类中
final DisplayMetrics mMetrics = new DisplayMetrics();// 构造方法,初始化了mMetrics
public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config,CompatibilityInfo compatInfo) {mAssets = assets;mMetrics.setToDefaults();if (compatInfo != null) {mCompatibilityInfo = compatInfo;}updateConfiguration(config, metrics);assets.ensureStringBlocks();
}// 获取密度值的方法
public DisplayMetrics getDisplayMetrics() {if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels+ "x" + mMetrics.heightPixels + " " + mMetrics.density);return mMetrics;}
}// 在DisplayMetrics类中
public void setToDefaults() {widthPixels = 0;heightPixels = 0;density =  DENSITY_DEVICE / (float) DENSITY_DEFAULT;densityDpi =  DENSITY_DEVICE; // 获取密度值scaledDensity = density;xdpi = DENSITY_DEVICE;ydpi = DENSITY_DEVICE;noncompatWidthPixels = widthPixels;noncompatHeightPixels = heightPixels;noncompatDensity = density;noncompatDensityDpi = densityDpi;noncompatScaledDensity = scaledDensity;noncompatXdpi = xdpi;noncompatYdpi = ydpi;}// 获取密度值
public static int DENSITY_DEVICE = getDeviceDensity();
private static int getDeviceDensity() {return SystemProperties.getInt("qemu.sf.lcd_density", // 获取当前系统的密度值SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); // 没有,则取默认值
}// 获取密度缺省值:160
public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
public static final int DENSITY_MEDIUM = 160;

当然在实际编程中,我们一般都把单位转换写成工具类,通过工具类来调用:

/*** 根据手机分辨率从DP转成PX* @param context* @param dpValue* @return*/
public static int dip2px(Context context, float dpValue) {float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);
}/*** 将sp值转换为px值,保证文字大小不变* @param spValue* @return*/
public static int sp2px(Context context, float spValue) {final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);
}/*** 根据手机的分辨率PX(像素)转成DP* @param context* @param pxValue* @return*/
public static int px2dip(Context context, float pxValue) {float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);
}/*** 将px值转换为sp值,保证文字大小不变* @param pxValue* @return*/public static int px2sp(Context context, float pxValue) {final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (pxValue / fontScale + 0.5f);
}

转载于:https://www.cnblogs.com/touko/p/6478851.html

Android原生系统API自带dp、px、sp单位转换相关推荐

  1. [转]Android中dp,px,sp概念梳理以及如何做到屏幕适配

    http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI ...

  2. 定制ROM不好用?Android原生系统用户暴涨2.5倍

    早年间,由于安卓原生系统不是很好用,中国的厂商因地制宜,推出了五花八门的定制级的安卓ROM,比如MIUI.EMUI.FlymeOS.ColorOS等等. 这些ROM中有很多好用得本地化功能,比如号码拦 ...

  3. Pixel3 XL 刷Android原生系统,刷Magisk 进行ROOT

    Pixel3 XL 刷Android原生系统,刷Magisk 进行ROOT 前言 一.基本信息 二.解锁OEM和BL 三.驱动安装下载 四.刷入google官方镜像 五.刷入面具Magisk,ROOT ...

  4. Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?

    目录 故事背景 二.开发步骤 Step1.添加一个专属系统级服务 2.1.1.模仿Android原生服务接口,如WifiManager,规划自己的Manager 2.1.2.为我们的Manager生成 ...

  5. 【转】Android中dp,px,sp概念梳理以及如何做到屏幕适配

    2019独角兽企业重金招聘Python工程师标准>>> 首先来看一下他们的基本概念: px   :是屏幕的像素点 dp   :一个基于density的抽象单位,如果一个160dpi的 ...

  6. android原生系统开发板,安卓学习必备开发板-Rayeager PX2

    由谷歌主导并推动的移动终端操作系统Android,由于其开源开放的特性,自发布之日起便受到全球各大IT厂商的欢迎.在各厂商的热情推动下,基于Android系统的手机.平板.智能手表等各类产品层出不穷, ...

  7. Android 调用系统api录音的两种方式(MediaRecorder、AudioRecord)

    废话 权限.权限.权限,必须要先获取了录音权限,其他的事情晚点再说. 另外,新版本的Android 10系统会对录音有调整,引入了一个录音焦点的概念,也就是说以前的麦克风只能一个APP使用,必须要等它 ...

  8. android原生系统手机游戏,ROG真游戏手机系统主页面有三大虚拟按键!安卓原生系统?...

    原标题:ROG真游戏手机系统主页面有三大虚拟按键!安卓原生系统? 为了满足用户玩游戏的需求,游戏手机在今年横空出世了,目前最具代表的就是黑鲨和红魔.相比普通的旗舰机,游戏手机除了配置更加强悍,同时散热 ...

  9. sp,dp,px尺寸单位

    前言: 众所周知,Android厂商非常多,各种尺寸的android手机.平板层出不穷.导致了Android生态环境的碎片化现象越来越严重.Google公司为了解决分辨率过多的问题,在Android的 ...

最新文章

  1. thinkbook14 2021版有两个显卡
  2. 免费的新一代私有云平台Nano v0.3.1发布:云主机快照及媒体管理
  3. linux命令框显示中文乱码_CentOS终端命令行显示中文乱码的解决方法
  4. C#通过获取快捷方式指向目标的小示例触碰WMI
  5. arthas的安装(在线/离线)和卸载
  6. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(转)
  7. 微小宝公众号排行榜_榜单 广东省技工院校微信公众号排行榜(第51期)
  8. 修改3389端口为3389端口
  9. 判断数组是否有序排列的0831
  10. linux下配置Java和Go环境
  11. @程序员,如何轻松实现数据可视化?
  12. BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)
  13. 刷卡机显示服务器连接失败,pos密码错误_POS机常见故障代码解释
  14. 计算机教室条幅文字,教室横幅标语尺寸
  15. 外包被辞,太心酸了!
  16. 斗图?教你用 Python 制作表情包
  17. H5实现win10日历效果
  18. [K8S]error execution phase preflight: couldn‘t validate the identity of the API Server
  19. 【R统计】主成分分析2——主成分回归
  20. 李宏毅Transformer

热门文章

  1. 从零开始学习springBoot(Contextpath+修改默认idk)
  2. Nodejs nmp 常用命令
  3. 《网络编程》守护进程
  4. 二路单调自增子序列模型【acdream 1216】
  5. 【翻译】在Sencha Touch中创建离线/在线代理
  6. mysql插入删除_mysql插入、更新与删除
  7. Intel Pin架构
  8. (4)ISE14.7 ChipScope使用流程(FPGA不积跬步101)
  9. (30)FPGA米勒型状态机设计(一段式)(第6天)
  10. (36)Verilog HDL关系运算:大于、小于、等于