Android屏幕适配和⽅案【整理】
版权声明:本⽂为HaiyuKing原创⽂章,转载请注明出处!
前⾔
这⾥只是根据参考资料整理下,具体内容请阅读参考资料。
原型设计图
推荐1倍效果图,即采⽤ 720 * 360 ⼤⼩( 1280 *720:两倍图 \ 1920 * 1080: 三倍图),最主要的原因就是1px = 1dp,效果图标多⼤的px,布局就写多⼤dp。
屏幕各项参数
⼿机像素(px):⼀个⼩⿊点就是像素;
⼿机尺⼨:屏幕的对⾓线的长度;
⼿机分辨率:整个屏幕⼀共有多少个点(像素),常见取值 480X800 ,320X480等;
像素密度(dpi):
1. 每英⼨中的像素数(假如设备分辨率为320*240,屏幕长2英⼨宽1.5英⼨,dpi=320/2 = 240/1.5 =160)
2. 对应于DisplayMetrics类中属性densityDpi的值;
3. 当然这种宽和⾼的dpi都相同的情况现在已经很少见,所以实际计算⽅式见下图;
  像素密度(dpi)、屏幕尺⼨、分辨率三者关系:
举例说明:屏幕分辨率为:1920*1080,屏幕尺⼨为5吋的话,那么dpi为440:
密度(density):
1. 每平⽅英⼨中的像素数(density = dpi / 160 );
3. 对应于DisplayMetrics类中属性density的值;
4. 可⽤于px与px与dip的互相转换:dp = px / density ;
  720P,和1080P的⼿机,dpi是不同的,这也就意味着,不同的分辨率中,1dp对应不同数量的px(720P中,1dp=2px,1080P中
1dp=3px)。
设备独⽴像素(dp、dip):
1.不同设备有不同的显⽰效果,不依赖像素(dp = px / density =  px / (dpi / 160) )
2.dpi(像素密度)为160 的设备上1dp = 1px。
  也叫dip(density independent pixel)直译为密度⽆关的像素。我们猜测如果使⽤了这个单位,我们在不
同屏幕密度的设备上显⽰的长度就会是相同的。问题来了,在屏幕上显⽰图像时都是在屏幕上填充像素点,⽽使⽤这种与密度⽆关的像素(我们在布局⽂件中使⽤的 dp/dip 就是与密度⽆关的像素)是如何转换成像素的呢?
  其实在安卓中,将屏幕密度为160dpi的中密度设备屏幕作为基准屏幕,在这个屏幕中,1dp=1px。其他屏幕密度的设备按照⽐例换算,具体如下表:
由上表不难计算1dp在hdpi设备下等于1.5px,同样的在xxhdpi设备下1dp=3px。这⾥我们从dp到px解释了Android中不同屏幕密度之间的像素⽐例关系。
下⾯换⼀个⾓度,从px到dp的变化来说明这种⽐例关系。
  就拿为App设计icon来说,为了让App的icon在不同的屏幕密度设备显⽰相同(这⾥我们选择在以mipmap开头的⽬录中都要设计⼀个icon),就必须要icon在屏幕中占据相同的dp。那么对于不同的屏幕密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照
2:3:4:6:8 的⽐例进⾏缩放。⽐如说⼀个icon的尺⼨为48x48dp,这表⽰在 MDPI 的屏幕上其实际尺⼨应为 48x48px,在 HDPI 的屏幕上其实
际⼤⼩是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际⼤⼩是 MDPI 的 2 倍 (96x96 px),依此类推。
放⼤像素(sp):⽤于字体显⽰;
dp转px、px转dp:
public class Dp2Px {
public static int dp2px(Context context, int dp) {
return (int) (dp * Resources().getDisplayMetrics().density + 0.5);
}
public static int px2dp(Context context, int px) {
return (int) (px / Resources().getDisplayMetrics().density + 0.5);
}
}
说明:0.5 是为了避免损失精度。
适配分类
⼀、图⽚适配
在AndroidStudio的资源⽬录res下有五个层级图⽚⽂件夹,分别⽤来存放不同分辨率的图⽚:
drawable-ldpi :低分辨率(⽤的少了,⼀般不再⽤)
drawable-mdpi:中分辨率
drawable-hdpi:⾼分辨率
drawable-xdpi:较⾼分辨率
drawable-xxdpi:超级⾼分辨率
drawable-xxxhpi:顶级分辨率
在对应的⽂件夹下放置不同分辨率的图⽚就可以很好的对图⽚进⾏适配。
随着屏幕越来越⼤,推荐xxdpi的⼀套切图,这样就可以向下和向上兼容,节省资源。
建议图标使⽤svg格式,图⽚仍然使⽤png格式,svg的图标⼤⼩约是png的1/4,在很⼤的项⽬中,图标有很多,这个时候svg的优势就凸显⽆疑了。
⼆、布局适配
在layout之外,根据不同分辨率,创建不同的布局⽂件夹:
layout-800 * 480
layout-1280 * 720
⼿机会根据分辨率去设定的不同⼤⼩的layout的布局。实际开发中这种使⽤的情况⾮常少,因为占⽤太多资源,慎⽤。
三、权重适配
当两个或者更多布局占满屏幕宽或⾼的时候,⼦布局可以使⽤权重适配,常见于LinearLayout线性布局中。
四、屏幕适配
详细内容请阅读参考资料。以下内容均是引⽤!
1、dp+⾃适应布局+weight⽐例布局直接适配
这基本是最原始的Android适配⽅案。
wrap_content,match_parent,layout_weight等,我们就要毫不犹豫的使⽤,⽽且在⾼这个维度上,我们要依照情况设计为可滑动的⽅式,或者match_parent,尽量不要写死。总之,所有的适配⽅案都不是⽤来取代match_parent,wrap_content的,⽽是⽤来完善他们的。
缺点
(1)这只能保证我们写出来的界⾯适配绝⼤部分⼿机,部分⼿机仍然需要单独适配;
  为什么dp只解决了90%的适配问题,因为并不是所有的1080P的⼿机dpi都是480,⽐如Google 的Pixel2(1920*1080)的dpi是420,
也就是说,在Pixel2中,1dp=2.625px,这样会导致相同分辨率的⼿机中,这样,⼀个100dp*100dp的控件,在⼀般的1080P⼿机上,可能都是300px,⽽Pixel 2 中,就只有262.5px,这样控件的实际⼤⼩会有所不同。
(2)这种⽅式⽆法快速⾼效的把设计师的设计稿实现到布局代码中,通过dp直接适配,我们只能让UI基本适配不同的⼿机,但是在设计图和UI代码之间的鸿沟,dp是⽆法解决的,因为dp不是真实像素。⽽且,设计稿的宽⾼往往和Android的⼿机真实宽⾼差别极⼤,以我们的设计稿为例,设计稿的宽⾼是375px*750px,⽽真实⼿机可能普遍是1080*1920;那么在⽇常开发中我们是怎么跨过这个鸿沟的呢?基本都是通过百分⽐啊,或者通过估算,或者设定⼀个规范值等等。总之,当我们拿到设计稿的时候,设计稿的ImageView是128px*128px,当我们在编写layout⽂件的时候,却不能直接写成128dp*128dp。在把设计稿向UI代码转换的过程中,我们需要耗费相当的精⼒去转换尺⼨,这会极⼤的降低我们的⽣产⼒,拉低开发效率。
2、dimens基于px的适配(宽⾼限定符适配)
原理
根据市⾯上⼿机分辨率的占⽐分析,我们选定⼀个占⽐例值⼤的(⽐如1280*720)设定为⼀个基准,然后其他分辨率根据这个基准做适配。
基准的意思(⽐如320*480的分辨率为基准)是:
宽为320,将任何分辨率的宽度分为320份,取值为x1到x320
长为480,将任何分辨率的⾼度分为480份,取值为y1到y480
例如对于800 * 480的分辨率设备来讲,需要在项⽬中values-800x480⽬录下的l⽂件中的如下设置(当然了,可以通过⼯具⾃动⽣成):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="x1">1.5px</dimen>
<dimen name="x2">3.0px</dimen>
<dimen name="x3">4.5px</dimen>
<dimen name="x4">6.0px</dimen>
<dimen name="x5">7.5px</dimen>
可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ;它的意思就是同样的1px,在320/480分辨率的⼿机上是1px,在480/800的分辨率的⼿机上就是1*1.5px,px会根据我们指定的不同values⽂件夹⾃动适配为合适的⼤⼩。
缺点
第⼀,Android不同分辨率的⼿机实在太多了,可能你说主流就可以,的确⼩公司主流就可以,淘宝这种App肯定不能只适配主流⼿机。
第⼆,控件在设计图上显⽰的⼤⼩以及控件之间的间隙在⼩分辨率和⼤分辨率⼿机上天壤之别,你会发现⼤屏幕⼿机上控件超级⼤。可能你会觉得正常,毕竟分辨率不同。但实际效果⼤的有些夸张。
第三,设计图(⽐如360640)上的内容占据屏幕的2/3,按照这种适配,特长⼿机(29601440 S8)上的内容也会占据2/3,这肯定不合理,控件之间的间隙会特别⼤,⼀看就不符合设计效果,⼿机长,内容占据低于2/3才正常,⽐如可能占据1/3.第四,占据资源⼤:好⼏百KB,甚⾄多达1M或跟多。
3、dimen 基于dp的适配(smallestWidth适配)
原理
这种适配依据的是最⼩宽度限定符。指的是Android会识别屏幕可⽤⾼度和宽度的最⼩尺⼨的dp值(其实就是⼿机的宽度值),然后根据识别到的结果去资源⽂件中寻对应限定符的⽂件夹下的资源⽂件。这种机制和上⽂提到的宽⾼限定符适配原理上是⼀样的,都是系统通过特定的规则来选择对应的⽂件。
举个例⼦,⼩⽶5的dpi是480,横向像素是1080px,根据px=dp(dpi/160),横向的dp值是1080/(480/160),也就是360dp,系统就会去寻是否存在value-sw360dp的⽂件夹以及对应的资源⽂件。
smallestWidth限定符适配和宽⾼限定符适配最⼤的区别在于,有很好的容错机制,如果没有value-sw360dp⽂件夹,系统会向下寻,⽐如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp⽂件夹下⾯的资源⽂件。这个特性就完美的解决了上⽂提到的宽⾼限定符的容错问题。
缺点
Android 私⼈订制的原因,宽度⽅⾯参差不齐,不可能适配所有的⼿机。
sp和dp值有些值不全(这个应该是可以解决的),姑且算是⼀个⼩问题。
项⽬中增加了N个⽂件夹,上拉下拉查看⽂件⾮常不⽅便:想看string或者color资源⽂件需要拉很多再能到达。
通过宽度限定符就近查的原理,可以看出来匹配出来的⼤⼩不够准确。
是在Android 3.2 以后引⼊的,Google的本意是⽤它来适配平板的布局⽂件(但是实际上显然⽤于diemns适配的效果更好),不过⽬前所有的项⽬应该最低⽀持版本应该都是4.0了(糗事百科这么⽼的项⽬最低都是4.0哦),所以,这问题其实也不重要了。
>svg图片怎么使用

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。