您的位置:首页 > 移动开发 > Android开发

android屏幕适配dip,dpi,px,sp相关

2015-06-22 20:32 323 查看
屏幕适配几乎是每个安卓开发界面模块都会遇到的问题。曾经我的apk在自己面前几个设备运行正常,一到用户那边就各种问题,于是各种查资料,最终适配还算完美。下面就结合我自己的体会说说屏幕适配相关的问题。由于是个人见解,如有不对的地方还望各位指出,同时也希望我的总结能帮到一些遇到适配问题的朋友。

首先,说一下dpi,它是每英寸上的像素数或点数。sp,是用来设置字体大小的字体的缩放,dip,也就是dp,设备独立像素,这个和设备的硬件有关。了解了大致的概念后来看具体的使用。

安卓中获取以上各个概念值的方法如下:

//获取屏幕分辨率以及DPI
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;//获取屏幕宽度 , 单位px 
int height = dm.heightPixels;//获取屏幕高度,单位px
float dpi = dm.densityDpi;//获取屏幕dpi ,(每英寸上的像素数或点数) 
float percent = dm.density;//获取屏幕像素与dip的比例
float sp = dm.scaledDensity;//和sp相关,设置字体的大小
如果是xml中写布局,系统会自动进入对应的drawable查找对应的图片,xml中设置的宽高最好用dp,这样设置出来的值在不同分辨率的机器上对应的效果都是相同的。比如说:原本计划设置的宽度在xml布局中是5dp,这个时候效果是最好的。如果在代码中设置,就要用percent*5,这个时候的效果和布局中是一致的,也就是布局加载时已经自动判断了分辨率加载对应的效果。此处的percent是屏幕像素与dip的比例:
160dpi的设备 1dip = 1px 

240dip的设备 1dip = 1.5px  

如果某个布局,我们在xml中设置了具体的宽高或者距离值,用的是dp,这个时候需要动态的修改一个控件的大小,在代码中设置。我们就要先获取屏幕像素与dip的比例,也就是上面的percent,然后乘以具体的数值(本来打算在布局中写的数值),就可以在不同设备上得到我们想要的相同效果。注意,此处可以直接设置padding,但是对于宽度或者高度需要用layoutparams设置才有效。如下:

<span style="white-space:pre"> </span>LayoutParams params = new LinearLayout.LayoutParams((int) (percent*100), LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(params);
tv.setPadding((int) (percent*15), 0, 0, 0);
这样在xml中设置tv的宽度为100dp,paddingleft为15dp,和此处的效果相同,不同机器都可以适配。
我还遇到过一种在xml中写布局后不同机器运行出来控件位置不同的情况,因为布局内的图片需要动态添加,而下面的输入框大小又是恒定的,所以布局错乱。最后我把整个布局都改成了动态布局,全部在代码中写出来,虽然比较麻烦但是可以解决适配问题。因为Android的机型实在是太多了,在xml中就算写不同分辨率也不一定能走到对应的布局文件中去,而在代码中可以判断当然机器大致的宽高比,比如我当时用的就是屏幕的宽度和percent的比例,大于500是一种布局,小于500是另一种布局,都是动态添加,这样基本解决了适配问题。一般480*800的机器宽比上percent的值都小于500,这种percent一般值为1,而一些分辨率比较高但是屏幕又比较小的机器,这个比例就超过了500,我的情况是当前的布局并不适合这种比例,所以就加载另一套布局,效果很好。
以上仅仅是个人总结,是自己开发中遇到的一些适配问题的记录,希望可以帮到需要帮助的人。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 屏幕适配 dpi dip sp