特意想了解下dp这些单位的概念去发现更是凌乱 网上的说法太他吗不一样现在自己总结下子于是看到一些帖子真实千奇百怪
dp/dip (density-independent pixels)密度/设备独立像素,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
首先说下 dip和dpi 和dp:前人不见解释的;
dpi:屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。
dp就是dip 就是 dpi/160;比如以上玻璃就是160/160就是刚好1 ;dp=1;dip=1;
一:dp现在还是不知道叫啥 但是的确和dip是一样 (看到有些论坛说dp和设备密度无关 dip和密度有关最后总结说 dp和dip一样 凌乱了我.....)这个意思就是一英寸玻璃里面装了多少像素(px).谷歌说装160个像素的是标准的就是密度1 ,320像素的超高的就是密度2 ,就像温度单位一样 摄先生说水结冰的温度就是零度 沸点就是一百度,其他自己等分的算。结果华先生凌乱了..
二:dp和屏幕密度是有关的,(很多帖子都说无关 好吧去的他蛋蛋..也没有找到有关的到底和那些有关。。。。) 无关可以但是必须有前提: 比如两快大小 同样是4寸且 宽高比为 一样 16:9 ,一个480*800 一个 320*480 这样你设置160dp发现 他们的长度是一样的,那么这个和屏幕密度无关是不是说屏幕尺寸一样,宽高比列相同就可能了?还是 不行。....假如上面两块玻璃前面不变。分辨率一个是 480*800 一个300*480,发现长度又变了。 不要说没这个屏幕 只是举个列子 市场证明屏幕分辨率奇葩的确实很多估计菊花一紧了,出现这个原因很简单 安卓 在你设置dp的时候最终会转换乘分辨率来设定大小也就是 dp大小乘以屏幕密度density/160=px像素了。但是个density并不是你屏幕的真真的密度 ,因为谷歌只把屏幕划分出四个,等级低密度(<=0.75) 普通(1) 密度,高(1.5),超高 (=>2)我看到一
个列子来证明这一点:如果真实密度去计算把dp转换px那么G7横向是480分辨率.密度是252这样的话310dp * (252 / 160) = 488已经满屏事实不是如此:
G7的真实dpi是252,根据我以前的理解,310dp换算成px应该是:310 * (252 / 160) = 488像素,而G7水平方向是480px,310dp在这上面绝对满屏都不止了,
肯定满屏了..事实上Android系统并没有拿252作为dpi来计算,而是将G7视 作hdpi设备,然后使用240dpi来计算最终像素,
所以在G7上320dp刚好是:320 * (240 / 160) = 480像素才能刚好满屏了,310dp确实要差一点点。
这是别人一个列子证明不是真实密度去换算自然以上我说的.那么到底要怎么才能说是和设备密度无关呢:
1,尺寸相同 2,宽高比列一样 3,密度比是(0.75,1,1.5,2)这的一种不然安卓就会粗略计算 比如1.4的直接划分在1.5也就变了。马蛋就这样不负责我说出
一个密度无关,这么一大堆前提 此时大吼一声fuck!
二 总结一些问题 比如一个屏幕到底多少dp是满屏 ?试试证明不同的屏幕尺寸就会不同的dp值满屏 不如5.5寸 1280*720的16:9屏幕
x^2+(x*9/16)^2=5.5^2算出来这块玻璃长宽是多少,再相乘得到面积 (提醒下这个5.5不是面积而是屏幕对角线的长度,)用分辨率除以
面积可以得到密度我没计算但是肯定得到的320,安卓了为了方便将160定义为标准的1那么 320就是2,我们一般说这个屏幕密度就是2了
当然一般直接在手机上测试一下既可以得到各种屏幕信息了不可能傻到自己去计算了呵呵呵~
DisplayMetrics dia = new DisplayMetrics(); getWindow().getWindowManager().getDefaultDisplay().getMetrics(dia);那么这个屏幕横向是计算公式是这样的dp=px/(密度/160)那么720px密度是2也就是说720/(320/160)=360dp 实际怎么360dp这块屏幕刚好满屏
因为别人说都会说屏幕密度比是2很少说是密度是320,一般直接用密度比dp=px/密度比;这样你就知道了吧 看看不同的屏幕确实不同的dp才满屏.
三在总结一点:两个密度相同的玻璃都是2设置相同的px比较发现长度不一样,(这里两个屏幕本身确实都是2不是说一个1.8一个2.1谷歌划分到2的)
这个测试了一下的确。按照道理来说,密度相同就是一英寸能装的像素相等,那么同样160px在密度相同的屏幕都是160px*(1/160)=1英寸呀?why?
有凌乱了..但是结果发现
DisplayMetrics dia = new DisplayMetrics(); getWindow().getWindowManager().getDefaultDisplay().getMetrics(dia); this.density = dia.density; float dh = dia.ydpi;两个屏幕一个dia.ydpi 是290一个dh是268;我把另一个乘以268/290.0这样他娘的还一样长,问题来了 为何密度是2 长宽的密度xdpi和ydpi去不同?好吧应该
是xdpi和ydpi是线性的 我们要的面型的 x乘以y才是面呢.我也不太懂了。。。留着在更新吧
屏幕适配在写....