最近做一个修改图片大小的功能,要求图片的宽度和高度单位可用px,也可用mm,这时需要用到px和mm相互转换。

第一步:px和mm之间转换首先要计算出屏幕的dpi ,

参考文章https://www.cnblogs.com/mixiyou/archive/2013/03/13/2957810.html

DPI计算公式:DPI = 宽 / ((尺寸2 × 宽2) / (宽2 + 高2))1/2 = 长 / ((尺寸2 × 高2) / (宽2 + 高2))1/2

/*** 获取DPI,图像每英寸长度内的像素点数* DPI = 宽 / ((尺寸2 × 宽2) / (宽2 + 高2))1/2 = 长 / ((尺寸2 × 高2) / (宽2 + 高2))1/2* @return*/public float getDPI() {//获取屏幕尺寸double screenSize = ScreenInchUtils.getScreenInch(activity);//获取宽高大小int widthPx=activity.getResources().getDisplayMetrics().widthPixels;int heightPx=activity.getResources().getDisplayMetrics().heightPixels;float dpi=(float)(widthPx/Math.sqrt((screenSize*screenSize*widthPx*widthPx)/(widthPx*widthPx+heightPx*heightPx)));return dpi;}

计算出dpi后可以用下面的转换方式

1、输入以px为单位的值得到mm

 //px转毫米public int pxWidthToMm(int value) {orignWidth=value;float inch = value / getDPI();int c_value = (int)(inch * 25.4f);return c_value;}//px转毫米public int pxHeightToMm(int value) {orignHeight=value;float inch = value / getDPI();int c_value = (int)(inch * 25.4f);return c_value;}

2、mm 转px(不要急,注意看下面的解释和改变的方法)

 //毫米转pxpublic int mmToPx(int value) {float inch = value / 25.4f;int c_value = (int)(inch * getDPI());return c_value;}

注意:使用mmToPx这种方式,会发现每次切换值都在变化,是因为小数点转成了int ,再从int计算为float会有误差。为了避免值不断切换,我添加了orignWidth和orignHeight两个参数用来记录初始值,并将mm转px的方法改变为如下:

 public int mmWidthToPx(){return orignWidth;}public int mmHeightToPx(){return orignHeight;}

获取屏幕尺寸的ScreenInchUtils:

public class ScreenInchUtils {private static double mInch = 0;public static double getScreenInch(Activity activity) {if (mInch != 0.0d) {return mInch;}try {int realWidth = 0, realHeight = 0;Display display = activity.getWindowManager().getDefaultDisplay();DisplayMetrics metrics = new DisplayMetrics();display.getMetrics(metrics);if (Build.VERSION.SDK_INT >= 17) {Point size = new Point();display.getRealSize(size);realWidth = size.x;realHeight = size.y;} else if (Build.VERSION.SDK_INT < 17&& Build.VERSION.SDK_INT >= 14) {Method mGetRawH = Display.class.getMethod("getRawHeight");Method mGetRawW = Display.class.getMethod("getRawWidth");realWidth = (Integer) mGetRawW.invoke(display);realHeight = (Integer) mGetRawH.invoke(display);} else {realWidth = metrics.widthPixels;realHeight = metrics.heightPixels;}mInch = formatDouble(Math.sqrt((realWidth / metrics.xdpi) * (realWidth / metrics.xdpi) + (realHeight / metrics.ydpi) * (realHeight / metrics.ydpi)), 1);} catch (Exception e) {e.printStackTrace();}return mInch;}/*** Double类型保留指定位数的小数,返回double类型(四舍五入)* newScale 为指定的位数*/public static double formatDouble(double d, int newScale) {BigDecimal bd = new BigDecimal(d);return bd.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();}}

Android代码实现 px和mm相互转换,DPI的计算相关推荐

  1. Android中的px、ppi(dpi)、dp(dip)、sp

    文章目录 一.关于px.ppi(dpi).dp(dip).sp 二.dp与px的关系 三.获取屏幕状态信息 一.关于px.ppi(dpi).dp(dip).sp px(pixel)像素,像素实际上是一 ...

  2. Android的计量单位px,in,mm,pt,dp,dip,sp

    px   :是屏幕的像素点 in    :英寸 mm :毫米 pt    :磅,1/72 英寸 dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip  :等 ...

  3. Android常用计量单位详解(px,in,mm,pt,dp,dip,sp)

    Android常用计量单位详解(px,in,mm,pt,dp,dip,sp) 在传统PC软件开发中经常以像素为单位设计计算机用户界面.例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素, ...

  4. 2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别(最详细,屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)

    0 前言 快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做 ...

  5. android dp转px的公式_dp和px换算公式

    dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  6. android 动态绘制布局,Android代码和绘制曲线中按钮和绘图板的动态布局

    时间: 2019年1月11日 本文向您介绍Android代码中的按钮和绘图板的动态布局和绘制曲线,主要包括示例android 动态绘制曲线,应用技巧,基本知识和知识android 动态绘制曲线,包括A ...

  7. Android编译命令m、mm、mmm区别及工程搭建示例

    要使用m.mm.mmm命令对Android代码进行模块编译,需要先执行如下命令初始化环境. source build/envsetup.sh lunch 执行lunch时一般会通过命令行提示选择版型, ...

  8. px、pt、dpi、dip、分辨率、屏幕尺寸等等概念

    文章目录 基本概念 屏幕尺寸 屏幕比例 像素px pt/point 分辨率 DPI(点每英寸) PPI(像素每英寸) DIP/DP density Android IOS 最后 参考资料 基本概念 屏 ...

  9. 常用Android代码

    这里收集了大家常用的一些Android代码,持续更新中,内容来自自己的平时积累和网络上看到的文章,部分原文地址在最下方.如有错误欢迎指正里面可能会有重复内容,请忽略或者提醒我删除. setBackgr ...

最新文章

  1. git 修改仓库的描述_git简介、基本命令和仓库操作
  2. HDOJ-2012 素数判定
  3. unity怎么实现人脸追踪_Unity 2019.2 beta为AR增加面部追踪、2D图像追踪、3D对象追踪等功能...
  4. Linux 7 关闭、禁用防火墙服务
  5. 2022年寒假ACM练习2(待补题)
  6. 怎么将音频原始文件导入matlab,Matlab2019b音频文件读取
  7. 历年计算机信息系统管理师真题,历年计算机软考信息系统项目管理师真题
  8. 【记录】数控程序的指令代码---标准G代码与标准M代码
  9. USB 鼠标接线顺序
  10. ChinaSkills-网络系统管理001(网络应用赛项改革)
  11. 微信 app---uwp
  12. Java程序员学习必看 干货
  13. JAVA-计算两篇文章的相似度
  14. iptables中snat、dnat、masquerade
  15. docker-compose 部署shipyard
  16. 带库的pydroid安装与使用。
  17. 开源协同办公软件多人在线编辑office 地址:http://www.dzzoffice.com/
  18. 国外整理的一套在线渗透测试资源合集[转载]
  19. docker常用的命令笔记
  20. 低成本佐川泽川圣安变频器设计方案

热门文章

  1. [KM算法]hdoj 3718:Similarity
  2. 陈雄华 精通Spring 2.x——企业应用开发详解
  3. enscape安装错误2503_SothmoDraw
  4. 阿里云ET工业大脑助力智能制造转型
  5. 【cocos2d-x 手游研发----博彩大转盘】
  6. 霍尔效应电流传感器——以开环电流传感器实现闭环精度
  7. 代码之夏:雷管框架的进展
  8. 数据归一化 npy统计函数 random模块
  9. linux下查找文件及文件内查找内容--find/grep/sed/awk
  10. python--模拟蜂窝网(https)登陆总结