Android代码实现 px和mm相互转换,DPI的计算
最近做一个修改图片大小的功能,要求图片的宽度和高度单位可用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的计算相关推荐
- Android中的px、ppi(dpi)、dp(dip)、sp
文章目录 一.关于px.ppi(dpi).dp(dip).sp 二.dp与px的关系 三.获取屏幕状态信息 一.关于px.ppi(dpi).dp(dip).sp px(pixel)像素,像素实际上是一 ...
- Android的计量单位px,in,mm,pt,dp,dip,sp
px :是屏幕的像素点 in :英寸 mm :毫米 pt :磅,1/72 英寸 dp :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip :等 ...
- Android常用计量单位详解(px,in,mm,pt,dp,dip,sp)
Android常用计量单位详解(px,in,mm,pt,dp,dip,sp) 在传统PC软件开发中经常以像素为单位设计计算机用户界面.例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素, ...
- 2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别(最详细,屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)
0 前言 快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做 ...
- android dp转px的公式_dp和px换算公式
dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...
- android 动态绘制布局,Android代码和绘制曲线中按钮和绘图板的动态布局
时间: 2019年1月11日 本文向您介绍Android代码中的按钮和绘图板的动态布局和绘制曲线,主要包括示例android 动态绘制曲线,应用技巧,基本知识和知识android 动态绘制曲线,包括A ...
- Android编译命令m、mm、mmm区别及工程搭建示例
要使用m.mm.mmm命令对Android代码进行模块编译,需要先执行如下命令初始化环境. source build/envsetup.sh lunch 执行lunch时一般会通过命令行提示选择版型, ...
- px、pt、dpi、dip、分辨率、屏幕尺寸等等概念
文章目录 基本概念 屏幕尺寸 屏幕比例 像素px pt/point 分辨率 DPI(点每英寸) PPI(像素每英寸) DIP/DP density Android IOS 最后 参考资料 基本概念 屏 ...
- 常用Android代码
这里收集了大家常用的一些Android代码,持续更新中,内容来自自己的平时积累和网络上看到的文章,部分原文地址在最下方.如有错误欢迎指正里面可能会有重复内容,请忽略或者提醒我删除. setBackgr ...
最新文章
- git 修改仓库的描述_git简介、基本命令和仓库操作
- HDOJ-2012 素数判定
- unity怎么实现人脸追踪_Unity 2019.2 beta为AR增加面部追踪、2D图像追踪、3D对象追踪等功能...
- Linux 7 关闭、禁用防火墙服务
- 2022年寒假ACM练习2(待补题)
- 怎么将音频原始文件导入matlab,Matlab2019b音频文件读取
- 历年计算机信息系统管理师真题,历年计算机软考信息系统项目管理师真题
- 【记录】数控程序的指令代码---标准G代码与标准M代码
- USB 鼠标接线顺序
- ChinaSkills-网络系统管理001(网络应用赛项改革)
- 微信 app---uwp
- Java程序员学习必看 干货
- JAVA-计算两篇文章的相似度
- iptables中snat、dnat、masquerade
- docker-compose 部署shipyard
- 带库的pydroid安装与使用。
- 开源协同办公软件多人在线编辑office 地址:http://www.dzzoffice.com/
- 国外整理的一套在线渗透测试资源合集[转载]
- docker常用的命令笔记
- 低成本佐川泽川圣安变频器设计方案