黑马程序员技术交流社区

标题: 【济南中心】Android就业面试技巧系列-技术篇(屏幕适配) [打印本页]

作者: 小鲁哥哥    时间: 2017-2-26 16:57
标题: 【济南中心】Android就业面试技巧系列-技术篇(屏幕适配)
【济南中心】Android就业面试技巧系列-技术篇(屏幕适配)
答题技巧
屏幕适配是目前安卓开发大部分程序员都会遇到的问题,回答时候,面试官会直接问你对屏幕适配如何看待,此问题需要循序渐进,点滴从经验作答,最终阐述清楚原理。具体可分如下步骤:
1、开发中遇到的机型以及分辨率
2、开发中用到的屏幕适配方案,以及科学的屏幕适配共有几种
3、根据自己经验,哪种适配适合什么场合使用
4、屏幕适配原因以及适配原理如何
5、自己对屏幕适配的感觉以及未来发展方向的评估
回答要点
1、 为什么要进行屏幕适配。
2、 屏幕适配原理如何。
3、 日常开发中针对不同机型以及不同情况使用到的屏幕适配方案。
要点一:为什么要进行屏幕适配。
安卓手机的多样化如今越来越显现出来,各大厂商都开始开发属于自己的系统以及机型,分辨率也是千变万化,适应了自己的需求。
要点二:屏幕适配原理如何。
说完为何要屏幕适配,紧接着我们就进入我们的重点,屏幕适配该怎么做,首先我们要明白几个概念,屏幕尺寸,屏幕分辨率以及屏幕像素密度。
屏幕尺寸指的是屏幕的对角线长度,以手机为例,目前我们常见的尺寸有4.2、5.0、5.5等,屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080。屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
说完基本的概念之后,我们就会引出几个基本的单位,dp、dip、dpi、sp、px。
1、首先我们说明,px即像素,一个像素则表明在屏幕上的一个点,一个显示单位。
2、dp和dip是一个意思,全称是密度无关像素,在Android中,规定以160dpi为基准,           1dip=1px如果密度是320dpi,则1dip=2px,以此类推。
3、dip和dp我们明白了,那么dpi呢,dpi即Diagonal pixel,代表每英寸像素数,表示对           角线的像素值 ,我们以WVGA(800*480)分辨率,3.7英寸的密度           为例(图2),dpi = 933/3.7=252,即我们此机型的dpi252
当我们拿到一部需要适配的手机的时候,如果知道了它的dpi,此时我们就可以做适配了。在安卓设备中,我们目前可以分为mdpi、hdpi、xdpi、xxdpi等几种情况,ldpi已经不太常见,针对这几种dpi,我们可以按照图3所示,来判定我们需要适配的设备位于哪个范围。从而根据此不同的dpi进行不同的处理,来实现我们的适配目的。
要点三:日常开发中针对不同机型以及不同情况使用到的屏幕适配方案。
目前我们开发中能使用到的屏幕适配方法,有以下几种:
1、使用不同套图适配
a) 使用套图适配,目前来说是针对图片适配的最好适配方法,可以防止图片的失真以及变形,但针对不同手机进行不同的套图适配,会对UI人员施加过大的工作压力以及对我们app本身也会造成冗余的影响,我们都知道,图片资源是使我们app变的臃肿罪魁祸首。
b) 优点:完美适配,不会失真
c) 缺点:不易达到,app臃肿
2、9path适配
a) 9path图片作为特殊的png图片,可以在特定的情况下对不同机型进行适配,而达到图片不失真的情况。
b) 优点:①省精力和时间、②省内存、③减少代码量
c) 缺点:需要每张图片进行制作处理,单一,图片中部分区域不会随整图改变而改变,从而不能完全适合所有图片适配
3、布局适配
a) 使用权重适配
i. 由图4可以看出,在格局比较明朗的页面中,如果我们能少用具体大小dp值,多用权重,可以在不同的分辨率下都能做到完美适配。但此种适配仅仅局限于格局比较明朗的界面中,如果在一个界面中,有各种嵌套和各种复杂布局,则就显得力不从心了。

4、使用dimens适配
根据不同values下的dimens进行适配,android项目会自动找寻相适应的dimens,我们可以在多种不同的values下建立dimens文件如图

在使用dimens的时候,我们可以在dimens文件中,用px为单位,这样就能达到完美适配。如图
5、代码适配
a) 我们也可以在java文件中,使用java代码进行适配,相比较xml的话,此种适配方法更迅捷。
b) 通过获取View的参数并结合dimens进行适配
i. LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)
ii. getResources().getDimension(R.dimen.dimen_1_dip);




作者: zhangkaitong    时间: 2017-2-27 13:39
赞赞赞!!!!
作者: baby14    时间: 2019-7-15 07:25
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2