屏幕适配看多了,网上太多的理论已经晕了,就做了一些屏幕的数据测试,然后依据测试数据来总结一些东西吧。
获取数据源码:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int widthPixels = dm.widthPixels;
int heightPixels = dm.heightPixels;
int sDensityDpi = dm.densityDpi;
float sDensity = dm.density;
float scaledDensity = dm.scaledDensity;
float xdpi = dm.xdpi;
float ydpi = dm.ydpi;
Log.i("BaseActivity", "1 widthPixels = " + widthPixels); // 720
Log.i("BaseActivity", "2 heightPixels = " + heightPixels); // 1184
Log.i("BaseActivity", "3 sDensityDpi = " + sDensityDpi); // 320
Log.i("BaseActivity", "4 sDensity = " + sDensity); // 2.0
Log.i("BaseActivity", "5 scaledDensity = " + scaledDensity); // 2.0
Log.i("BaseActivity", "6 xdpi = " + xdpi); // 315.3
Log.i("BaseActivity", "7 ydpi = " + ydpi); // 318.74
以上就是dm的所有数据获取方式,依据参考文档获得的解释为:
下面展示测试数据,一共7个虚拟机外加2个真机
解释一下图片宽度这个数据的由来,我PS了一个长度为1000px的图片,然后,用HorizontalScrollView包裹,看整个屏幕上占到了图片的多少,来判断该屏幕以图片像素为单位的大小。即:该数据为n,则可表示为: 手机屏幕宽度 = n * 一个物理像素宽度 (并非屏幕像素)
做完以上数据,我这里就做一下自己的总结
第一:单位说明
widthPixels、heightPixels 的单位是:一个屏幕上屏幕像素的个数,注意我这里使用的文字是“屏幕像素”,这和我们通常说的图片像素大小是不一样的。
densityDip = 160 * density , 同时也近似于 xdpi,ydpi,scaleDensity; 而这几个的单位是:每英寸的屏幕像素个数。。
而这六个数据就是我所有的测试数据,足够讽刺的,原来基本都一样。这就是为什么,我们通常就操作widthPixels,heightPixels,density就够了。
第二:解释一下px,dp,ps。。总结完上面就好解释多了
px:一个屏幕像素的大小,一个屏幕的屏幕宽度,当然可以用 widthPixels * px = 屏幕宽度
dp:屏幕像素点的个数 除以density (即除以每英寸屏幕像素个数) 再乘以160的大小,也就是说:dp的大小 = 160 * 屏幕宽度(inch),其实这个数据也是近似的,看数据就知道
第三:着重解释两个数据的不同!!经常会弄混!!就是屏幕像素和图片像素!!!
屏幕像素:就是第一个表格的"widthPixels"
图片像素:就是第一个表格的"图片宽度(大概)"
可以明显的看出它们的单位大小是完全不同的!!而且没有任何规律可以寻找!!
经过这次,以后的使用我总结种方法:
第一:
还是和以往一样,用px 和 dp ,只是要注意他们的含义:
dp:它是和你的尺子测出的宽度(物理宽度)是完全成正比的,与其他任何都没有关系,无论在哪个手机上你设置为200dp,那么你用尺子测出的数就是一个定值(超过屏幕宽的不算)。
px:它除了和物理宽度相关,还和屏幕像素密度有关,因此经常用作图片显示。
顺带说一下sp吧,sp基本和dp大小一致,偶尔会因手机系统设置的字体大小和样式做出调整。
第二:
极端设想一下,A手机是720dp,B手机是360dp,那么你设置一个marginleft(360dp),那么A就完全看不见了,B还是在中间。
那么我们就想,要是有百分比的适配方法。
做法:
Way1:听说最近google有一个百分比的适配新的api,值得去尝试;
Way2:就是假设app开始的时候,将widthPixels分成720份,若给你的设计图的宽度是720px,这样设计图上的一个px,就表示屏幕的1/720了。 这样就只需要用widthPixels这一个单位。爽吧!!! 这要求和设计妹子勾搭好,这点很重要!!不仅可以做到屏幕适配的百分比分配,说不定还可以解决终生大事~~~