想要了解这部分的内容主要是因为在做一个android小游戏的时候,在实现组件跳动的时候,要用到组件的移动,那么问题来了,在不同的手机像素密度不同,分辨率不同,你要是用像素(px)作为移动单位的话,到了低一点的分辨率的手机上运行的时候,跳起的高度不是你在2k屏幕设置的理想的“肉眼”高度。就是所谓的不同分辨率的手机的适配问题,组件的适配可以直接用dp单位来固定组件的大小,但组件跳动的问题是动态变化的,不能写死,先说一下我实现跳动的原理,即利用计时器和重力公式实现在单位时间不停地减少y坐标的大小,y坐标的大小减掉0的时候,则加速下降。在这个过程中,减少y坐标的大小,要是按像素来减少的话,就会出现文章开头的问题。所以我想要用db这个与分辨率无关的单位来实现,但在网上查了一些资料,android好像没有提供直接设置dp的方法,只能先将需要减少的dp值根据公式转成px,再进行递减操作,这样子到了不同的分辨率的手机时,跳起的高度就一致了。
了解到:
分辨率:整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280x720,反之分辨率为1280x720的屏幕,像素宽度不一定为1280
屏幕密度:表示单位面积内的像素个数,通常用dpi为单位,即每英寸多少个像素点
px:长度单位,以具体像素为单位
dp:长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是: 1dp = (目标屏幕密度/标准密度)*px,标准密度为160dpi,例如,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi的平台则表示1.5个像素的长度
屏幕尺寸:屏幕的大小,通常用屏幕对角线的长度表示
其中1dp = (目标屏幕密度/标准密度)*px,就是我们要转换的公式
而目标屏幕密度=屏幕长的平方+屏幕高的平方的和再开根号/手机的尺寸,但是我们可以调用android提供的类来获取,而不用进行这一步的转换。
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
int densityDPI = dm.densityDpi;
densityDPI就是屏幕的密度(PPI)
根据densityDPI我们就可以进行dp到px的转换,解决上面提到的问题。
另外:
int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px)
int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高(像素,如:800p)
可以获取屏幕的宽度和高度
以下是摘取自别人的博客:
getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入哦)。