理解Android中dpi和分辨率的关系,谈谈Android做成适应全部手机的UI方式

最近我在做一个界面,UI给的切图是1280x720这个分辨率的,给的标注单位是px(像素)。


我把原图自然而然地放在drawable-xhdpi中,然后开始调整布局(当时我默认1dp=2px)。把这个布局放到一个720P的电视上,发现完全变形了,奇囧无比之际,看了下电视的density,发现这货是1,这是一个mdpi的设备!!!

然后我就开始想了,720P的切图,要放在xhdpi这里,但是有的设备自身是mdpi之类的,那这个分辨率和dpi到底是什么关系?


楼主先是查了下基本的概念:

1.DPI:dots per inch,一英寸的像素数量,这个值是设备自己决定的,是写死的,当然也有厂商自己搞了个density=1.25的,我都不知道该说啥了...

Google规定的见下表:

  一英寸有多少个点儿? 我们用来density来分辨
ldpi 120dpi 0.75
mdpi 160dpi 1
hdpi 240dpi 1.5
xhdpi 320dpi 2

2.DIP(也就是我们用的dip/dp):device independent pixel,设备独立像素,我们不会直接使用px,而是使用dp,1 px = 1dp * density(由DPI)决定。

这里完全没有涉及到分辨率的问题...我觉得dpi和分辨率之间压根没有关系...


和基友讨论了好一会,终于明白了以下这两个问题:


1.为什么一个720P的设备,取mdpi里的图片,但是720P的切图要放在xhdpi里?

A: 这完全是根据主流手机来决定的,比如现在主流的是480P/hdpi的手机,那么,在做UI时,就会取720P作为xhdpi,取320P作为mdpi,取240P作为ldpi,这样一套套图就切出来了。

如果,主流的手机分辨率变成了720P/hdpi的手机,那么,在做UI时,就会取480P作为mdpi,取1080P作为xhdpi,以此类推。

至于Google是这样推荐的:取你手边最大的分辨率作为基准,做出最清晰的图(xhdpi),然后,按比例缩放,做出hdpi、mdpi和ldpi。所以从原理上,720P的切图放在哪里是可以根据设备来变换的。


2.如果720P的切图在xhdpi里,但我手头有一个mdpi/720P的设备,那怎么办呢?

(假设你的应用要支持所有奇葩的分辨率,而且你已经切好了4套图(ldpi~xhdpi)  并在layout里写了一套布局)

A: 如果你自己思考了dpi和分辨率的关系的话,你会发现,他们的关系就是没有关系...所以这个问题,我的解决办法(大家的)是,让多套dimens来帮我们解决这个问题。

  480p 600p 720p 1080p
mdpi values-sw480dp-mdpi values-sw600dp-mdpi values-sw720dp-mdpi values-sw1080dp-mdpi
hdpi values-sw480dp-hdpi
xhdpi values-sw480dp-xhdpi
在你的res文件夹下,新建这些文件夹,然后再放进一个dimens.xml,用这种方法,就可以应对所有的分辨率情况了。

举例说明下:如果原图(1280x720)上有一个100x50(像素)大小的控件,那么对于一个正常的hdpi/800x480的设备来说,应该设置它的大小(dp)为:

长:(100/720*480/1.5)dp = 45dp (向上取整)

宽:(50/720*480/1.5)dp = 23dp

将这两个值写在values-sw480dp-hdpi/dimens.xml里,图的比例和原图就一样了。


那对于一个刚才我列举到的mdpi/1280x720的设备,它的大小应该是:

长:(100/720*720/1) = 100dp;

宽:(50/720*720/1) = 50dp;

将这两个值写在values-sw720dp-mdpi中,图的比例和原图就一样了。


3.不是我要黑IOS,如果IOS再出几个分辨率的话,那IOS开发者是不是都要抓狂了呢?

A: 就现在而言,我很高兴地回答你:是的! IOS布局的方式相当于Android中的绝对布局,而且它没有wrap_content和match_parent这些方式,等到IOS 10长到及腰时,我看你等做IOS开发的肿么办,哈哈。


综上,希望此帖可以帮到一些对Android布局有疑惑的同学~

展开阅读全文

没有更多推荐了,返回首页