Android关于屏幕适配中一些基础概念解释

1. 首先说手机屏幕大小,一般指的是手机屏幕对角线的长度,一般用屏幕对角线长度表示,单位英寸;

2. PX: Pixel(像素)的缩写,一般说手机的分辨率就是用PX来表述的,想1080*1920(2K屏),720*1280(1K屏),这两个分辨率是现在安卓机中占比最高的两种分辨率;当然切记分辨率跟屏幕大小没有关系;

3. dpi/ppi: 像素密度,每英寸屏幕上所拥有的像素点,比如我们手机对角线是5英寸,手机的分辨率是1920(高)*1080(宽),那使用勾股定理计算像素密度就是 1920的平方 与 1080的平方 相加开二次方根号后除以5(不会画图),算出来像素密度是440.58..,这就是手机屏幕的像素密度;

a.dpi(dots per inch)和ppi(pixels per inch)还是有一点点区别的,dpi指的是屏幕的打印分辨率,ppi才是真正的像素密度,这可能跟屏幕硬件的制造有关系吧,毕竟制造工艺上不能满足每个像素打印一个点,而我们上面算出来的440.58应该是ppi,因为我们使用理论像素去计算的(自我理解,欢迎纠错,如果是是个坑以后再补); 但是对于我们需要简单理解屏幕适配中得概念,可以将它们两个视为一个概念,在Android Studio中也基本上都使用dpi来描述;

b.dpi也就是像素密度真正的决定了一个手机屏幕显示效果是否清晰,也就是是否能看到屏幕的颗粒感(现在市面上手机基本上都没颗粒感了);

c.我们做屏幕适配准确的说就是根据不同dpi的手机屏幕去进行适配的,而不是根据分辨率,之所以现在说根据不同的分辨率进行适配,是因为手机屏幕的尺寸相差不是特别大,而且每种尺寸的屏幕基本上分辨率也是一定的,所以大家都习惯说是根据屏幕分辨率来进行适配的;一般情况分辨率1080*1920的手机屏幕(5英寸屏) dpi大概就在480dpi,也就是google所说的xxhdpi,720*1280的分辨率(5英寸屏)就是在320dpi,即google得xhdpi;这个dpi是我们通过Android java代码在手机中运行准确获得的,如果我们手动计算的话算出的应该是理论ppi;故想严格适配最好使用代码获取手机dpi(文章后面部分有代码);  补充:假设一个pad的尺寸很大,达到7",但分辨率只有12000*1920,那它的dpi也只有320dpi,也只是在xhdpi,所以我们说屏幕适配是根据dpi适配,而不是根据分辨率.

4. dp:dp是google在安卓中设计的一个单位.它以手机屏幕为160dpi定为标准屏幕(早期的小屏幕大多都为160dpi),在此屏幕上1dp=1px;而在其它不同dpi屏幕上,就以屏幕dpi和标准屏幕的dpi的比例进行像素计算;如刚才所说的1080*1920的5英寸屏手机为480dpi,那么这个比例就是480/160=3,所以在此屏幕上1dp=3px; 像素长度不同了,但在我们视觉效果上物理长度是相同的,以此使用dp单位就能达到个dpi手机屏幕的适配效果;

5.下面就是一些Android中比较实用的东西了:

a.获取一个屏幕准确的dpi: 因为手机制作工艺 显示工艺和其它概念性的问题,我们自己在得知分辨率和尺寸的情况下计算出来dpi是有很大误差的,故建议使用代码获取手机的dpi,代码:

<span style="font-size:14px;"><span style="font-size:14px;">int densityDpi = getApplicationContext().getResources().getDisplayMetrics().densityDpi;</span></span>

在分辨率为1080*1920,屏幕尺寸为5英寸的手机(小米3)上此代码获得的densityDpi为480dpi(xxhdpi);我们可以通过这个dpi来计算在此屏幕上dp与px的换算比例为480/160=3,或者可以直接使用代码获得这个比例,代码:

<span style="font-size:14px;"><span style="font-size:14px;"> float density = getApplicationContext().getResources().getDisplayMetrics().density;</span></span>

此代码在小米3手机上直接获得density=3,也就是dp与px换算比例为3,而且精确到float的值,毕竟不是每一部手机都把dpi做得那么标准,想以前的魅族mx3手机等就很奇葩;


b.下方列举常用的手机分辨率/dpi/density/drawable(新版studio中用mipmap概念进行替换) 之间的对应列表(x为未知,也就是我具体不知道参数 囧,因为现在很少用了):


c. 在会计算,并得知准确的density,也就是dp和px之间的比例后,我们在对页面布局时候就可以根据美工出图的分辨率准确的利用dp在xml中进行布局了;

i: 假设美工是按1080*1920的屏幕进行出图的(现在基本只出一套图,除非特别原因,否则不会在按其它分辨率出图,美工也方便,我们开发人员用dp也方便),我们在布局xml文件的时候可以在右侧Preview中选择相应分辨率的模拟器进行即时的布局观察;如下图这是我选择的Nexus5视觉模拟器,屏幕尺寸为5英寸,分辨率1080*1920480dpi,即xxhdpi; 若美工设计稿中有两个控件之间的距离为30px,那根据xxhdpi的density为3.0,我们就可以很方便的计算出我们在xml中写控件距离的时候写10dp就可以了(30px/3=10dp).这样不仅我们布局在1080*1920的屏幕上严格符合美工的标准,而且在其它dpi的屏幕上,而且在分辨率为720*1280的xhdpi的屏幕上起来视觉距离也是一样的,就很好的解决了不同分辨率的屏幕上的适配问题;或者我们也可以选择模拟器中Nexus5X,它的分辨率也是1080*1920,但dpi为420dpi,也就是density=420/160=2.625,故我们在计算dp的时候就是30px/2.625=11.42px,但显然这会很麻烦,故一般选择传统屏幕;   

总之一句话,美工出什么分辨率的图,我们就选择哪个分辨率的模拟器,并且模拟器的dpi与标准dpi160dpi的比例为整数,方便我们对px与dp之间的计算;这样布局在各屏幕上基本就不会有什么太大的问题;


ii:不同dpi的手机APP运行时,在drawable或者mipmap中取图片资源的时候是根据自身的dpi来取相应文件夹的图,比如Nexus5取图肯定是在drawable-xxhdpi中取图,如果xxhdpi中没有它此图,但xhdpi中有,它才会去xhdpi文件夹中取图;  一些初学者可能会说图片像素分辨率都是一定的,ImageView控件如果使用wrap_content的话,那在不同分辨率屏幕上,显示的图片大小肯定是不同的,这个问题是有,所以稍有经验开发者一般在做这种问题的时候会按照设计稿中得图片大小将ImageView的宽高写死,而不适用wrap_content,然后让图片去适应这个ImageView,这样图片的大小在各手机上看起来也就没多少区别了; 也避免了使用多套图的麻烦;






(欢迎纠正补充)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值