天天看点

安卓屏幕代码适配屏幕心得px和dp;sp和dp选择

特意想了解下dp这些单位的概念去发现更是凌乱 网上的说法太他吗不一样现在自己总结下子于是看到一些帖子真实千奇百怪 

dp/dip (density-independent pixels)密度/设备独立像素,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
           

2015年4月18日 20:02:15屏幕适配的一些心得:

1当用到listview或者scrollview这些可以滑动的布局时候直接设置一个dp大小就可以 反正可以滑动无关紧要

2最强方案 当布局设计很复杂比如上次做一个上下左右四个图片 中间一个圆形的图片 圆形的图片和上下左右隔一定距离实现一个圆圈.这就复杂.不管你

设置dp或者px最后在不同手机总是会有一些难看,于是乎xml文件全部只控制控件的位置,大小全部由代码实现.根据UI给的图片的大小乘以当前设备的大

小除以ui设计的分辨率 的比值(假如UI的设计图是1280*720.ui给的某个图片是宽是100 高是200  那么你先获取设备的分辨率加入是1920*1080 那么这个

控件的大小高是 200*(1280/1920),宽就是100*(720/1080)这样算出来的就算魅族16:10的屏幕也不会奇怪的现象)这样任何设备都能保持占用屏幕比值

不变..任何复杂的布局都推荐这个方法

3,sp和dp 虽然谷歌推荐sp设置文字,很多人也多是用sp设置文字去了,但是仔细想想谷歌为什么推荐用sp呢? 可以实现用户自己设置图片大小.

谷歌肯定希望自己的手机能有让用户设置字体大小这么一个功能不然又不是会被某某水果抨击.但是站在开发者上这样真的合适吗.默认下sp用户可以在

系统上sp和dp是相等的 但是用户可以在设置系统设置字体大小这样sp设置的字体就会相应的变大变小.然而你button写的16sp可能已经超过一个控件的

大小而溢出边界这是老板找的肯定是你的错 ,这样是否可以考虑设置dp大小的文字.呢?

1  一般文字内容浏览的地方还是设置sp因为这个一般不会让你的文字过大过小在控件中显得尴尬hui

2 对于button这样的按钮上的文字 都是文字不多 或者是导航栏actionbar这些文字少.包裹文字的控件的字体放大缩小会导致界面的不协调这时候可以

用dp当然如果你控件大小用px设置 字体也就用px  ;dp设置的字体也用dp 抱枕字体不溢出达到美观效果. 

最后强烈推荐xml设置和代码混合设置的方法.布局复杂的地方用代码控制大小 .xml控制每个控件的位置关系

首先说下 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;
		<span style=" line-height: 25.1875px; background-color: rgb(240, 240, 240); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; white-space: nowrap;"><strong>float </strong></span><span style=" line-height: 25.1875px; background-color: rgb(240, 240, 240); font-size: 14px; white-space: nowrap; font-family: Helvetica, Tahoma, Arial, sans-serif;"><strong>dh = dia.ydpi;</strong></span><h5><div style="POSITION: relative; WORD-WRAP: break-word; MARGIN-LEFT: 20px; PADDING-TOP: 2px"><a target=_blank target="_blank" href="eclipse-open:%E2%98%82=example_pahn/src%3Ccom.yung7086.pahn%7BExample_pahnActivity.java%E2%98%83Example_pahnActivity%5Edh" target="_blank" rel="external nofollow" ><img style="BORDER-BOTTOM: medium none; POSITION: absolute; BORDER-LEFT: medium none; WIDTH: 16px; HEIGHT: 16px; BORDER-TOP: medium none; BORDER-RIGHT: medium none; LEFT: -21px" alt="Open Declaration" src="file:/C:/Documents%20and%20Settings/Administrator/桌面/eclipse1/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png" /></a></div></h5>
           

两个屏幕一个 dia.ydpi  是290一个dh是268;我把另一个乘以268/290.0这样他娘的还一样长,问题来了 为何密度是2 长宽的密度xdpi和ydpi去不同?好吧应该

是xdpi和ydpi是线性的 我们要的面型的 x乘以y才是面呢.我也不太懂了。。。留着在更新吧

屏幕适配在写....

就写在这里吧一些心得:

1当用到listview或者scrollview这些可以滑动的布局时候直接设置一个dp大小就可以 反正可以滑动无关紧要

2最强方案 当布局设计很复杂比如上次做一个上下左右四个图片 中间一个圆形的图片 圆形的图片和上下左右隔一定距离实现一个圆圈.这就复杂.不管你设置dp或者px最后

最后在不同手机总是会有一些难看,于是乎xml文件全部只控制控件的位置,大小全部由代码实现.根据UI给的图片的大小乘以当前设备的大小除以ui设计的分辨率 的比值

这样任何设备都能保持占用屏幕比值不变..任何复杂的布局都推荐这个方法

3,sp和dp 虽然谷歌推荐sp设置文字,很多人也多是用sp设置文字去了,但是仔细想想谷歌为什么推荐用sp呢? 可以实现用户自己设置图片大小.谷歌肯定希望

自己的手机能有让用户设置字体大小这么一个功能不然又不是会被某某水果抨击.但是站在开发者上这样真的合适吗.默认下sp用户可以在系统上sp和dp

是相等的 但是用户可以在设置系统设置字体大小这样sp设置的字体就会相应的变大变小.然而你button写的16sp可能已经超过一个控件的大小而溢出边界

这是老板找的肯定是你的错 ,这样是否可以考虑设置dp大小的文字.呢?

1  一般文字内容浏览的地方还是设置sp因为这个一般不会让你的文字过大过小在控件中显得尴尬hui

2 对于button这样的按钮上的文字 都是文字不多 或者是导航栏actionbar这些文字少.包裹文字的控件的字体放大缩小会导致界面的不协调这时候可以用dp

当然如果你控件大小用px设置 字体也就用px  ;dp设置的字体也用dp 抱枕字体不溢出达到美观效果. 

最后强烈推荐xml设置和代码混合设置的方法.布局复杂的地方用代码控制大小 .xml控制每个控件的位置关系