我相信大家在android开发中,肯定会遇到一个问题,那就是屏幕适配问题,通常我们做app只需要适配各种类型的手机就OK了,最近公司要求把pad上的app适配到手机上,这个有点麻烦,所以着重研究了一下。
基本概念:dp、sp、px、dpi、density
- dp:最常用的长、宽、margin、padding等的单位
- sp:字体的单位,和dp差不多,区别是如果字体使用的sp为单位,那如果你手机字体调大了,那你app的字体会随之变大,如果用dp则不会变化。
- px:像素
- dpi:dots per inch,即每英寸上有多少个像素,也就是屏幕密度,具体计算下面写说
- density:density=dpi/160
dp和px转换
px=dp*(dpi/160)
计算dpi、density
以5.5寸1920 * 1080的手机为例:
5.5寸是指手机对角线的长度,分辨率是1920 * 1080,也就是知道长像素是1920,宽像素是1080,那么对角线多长呢,其实就是求斜边的长度:
1920^2+1080^2=2202^2
所以 dpi=2202/5.5=400
(哎呀,有点啰嗦了)
需要注意的 dp是不管你手机密度有多大,它的物理尺寸是不变的,就是说,比如一个图片设置大小100dp*100dp,那它在dpi为320的手机上就占 200px * 200px
,如果是dpi=400的手机上,那就占250px * 250px
,那么你在屏幕上看到图片的大小是没有变化的
(我相信做android开发,大家对这些应该就很熟悉了,就不详细写了,有不清楚的请自行学习,哈哈)
说说适配的事
1.使用相对布局
我这相对布局的意思,不只是使用RelativeLayout,还有使用LinearLayout中的weight。(插一句,在相同层级的情况下,推荐使用LinearLayout,如果可以减少层级,则使用RelativeLayout,但是如果使用了weight,LinearLayout也就失去了它的优势,和相对布局一样需要二次计算了)。
杜绝使用绝对布局!
我相信现在应该没有人用绝对布局了吧
在写布局的时候,就应该考虑到屏幕大或者小,显示会不会有问题。多想一下,很重要
我觉得只要布局写的好,基本可以解决90%的适配问题,当然这也是要修炼内功,才能运用顺畅的。(写的多就有经验啦)
2.生成各种尺寸的dimens
具体如何在values生成各种尺寸的dimens.xml,请参考下面链接
http://blog.csdn.net/hnzcdy/article/details/50628993
运行结果下图:
因为手机尺寸太多,所以有时候,我们不得不在不同屏幕大小,使用一些不同的值,这个时候用dimens就很方便了。
不过在这里,我主要是说,sw240dp是啥意思,以及不同的手机具体使用哪个dimens。具体怎么使用、生成,看上面那篇文章就可以啦。
sw:small width,最小宽度,即不管手机是横屏还是竖屏,屏幕可展示的最小边,比如1920*1080,那最小就是1080px。
那么怎么什么手机用什么dimen呢?怎么算呢?
举例说明:
- 还是以1920*1080 5.5寸的手机举例(这种手机目前比较多)
- 这种手机呢,dpi是400,denity是2.5,就是1dp=2.5px,(前面算的)
- dimens是按着最小边大于哪个值就找哪个值
- 那它应该用哪个dimens呢?1080/2.5=432,按着上图我们配置的,432>360,432<480,所以,最终使用的是sw360dp的dimens.xml
- 在320dp和480dp之间,有很多手机,所以我们可以把这个区间分的细一点,比如320、340、360、380、400,这样适配会更好点
有人可能会疑惑,为啥要算的这么麻烦呢,因为sw360dp,说的是最小边大于360dp就用这个dimens,但是我们知道手机分辨率是像素,是px,所以要换算一下
备注一下,使用dimens相当于是等比缩放,自己可以在DimenTool
中配置缩放比例
3.关于适配的感受
其实我觉得,要是想有好的用户体验,pad和手机最好还是两套设计,毕竟两者交互方式是有很大区别的,单纯移植肯定体验比较差。简单一点呢,就把一些比较明显不合适的地方,写两套布局,不同尺寸使用不同的布局。
写的有点乱,先这样记录一下。