最近做一个修改图片大小的功能,要求图片的宽度和高度单位可用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. 接口与抽象类的使用选择
  2. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
  3. Jetson nano刷好机之后需要做的准备工作
  4. 大地发生了变化写具体_小学语文三年级下册期末检测卷 (2)
  5. Vue结合HTML5拖放API 实现目录拖拽~
  6. mysql查询今天_昨天_7天_近30天_本月_上一月 数据_(转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据...
  7. python sorted函数_Python 经典面试题 二
  8. 火出边际的Serverless,你居然还不了解?
  9. javascript实现页面中回到顶部功能
  10. EJB+JSF开发示例(附源码)
  11. Pytorch专题实战——反向传播(Backpropagation)
  12. Lucene的分析过程
  13. 【VB.NET视频总结(一)】
  14. 制作Windows severs 2019启动盘
  15. 怎么放大图片不模糊?
  16. educoder——面向对象程序设计java——实验实训——实验三 - 集合框架
  17. 数据库学习2 排序检索数据
  18. 电话销售话术模板有哪些 电话销售技巧
  19. php usc2,CSDN 免积分下载原理
  20. 数值分析——两点三次Hermite插值

热门文章

  1. Grammarly错误
  2. grammarly 入门
  3. 符合泊松分布的事件模拟到达时间生成
  4. WAVE SUMMIT 2022定档520 飞桨又双叒有大动作
  5. 杰理之SD说明【篇】
  6. python字符串替换函数_Python正则替换字符串函数re.sub用法示例
  7. 跨业态、跨区域的品牌为什么需要统一的SCRM会员营销管理系统?
  8. Word2Vec实现情感分析(bug修正)
  9. NetworkManager is not running-liunx nmtui不可用
  10. 字典的静态方法(读、写、)