Android开发屏幕适配

问题说明

由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。OpenSignalMaps发布了第一份Android碎片化报告,2013年,支持Android的设备共有11868种。2014年,支持Android的设备共有18796种。屏幕尺寸这么多,为了让我们开发的程序能够比较美观的显示在不同尺寸、分辨率、像素密度(这些概念我会在下面详细讲解)的设备上,那就要在开发的过程中进行处理,这就是我们问题。

 

答题技巧

屏幕适配是目前安卓开发大部分程序员都会遇到的问题,回答时候,面试官会直接问你对屏幕适配如何看待,此问题需要循序渐进,点滴从经验作答,最终阐述清楚原理。具体可分如下步骤:

  1. 开发中遇到的机型以及分辨率
  2. 开发中用到的屏幕适配方案,以及科学的屏幕适配共有几种
  3. 根据自己经验,哪种适配适合什么场合使用
  4. 屏幕适配原因以及适配原理如何
  5. 自己对屏幕适配的感觉以及未来发展方向的评估

回答要点

  1. 为什么要进行屏幕适配。
  2. 屏幕适配原理如何。
  3. 日常开发中针对不同机型以及不同情况使用到的屏幕适配方案。

 

要点一:为什么要进行屏幕适配。

安卓手机的多样化如今越来越显现出来,各大厂商都开始开发属于自己的系统以及机型,分辨率也是千变万化,适应了自己的需求,以下是2015年2月到7月友盟指数统计的android设备不同分辨率使用的情况。

Android开发屏幕适配_第1张图片

图1

由图1中我们可以看到,现如今,主流分辨率竟然可以达到7种之多,在这里面不仅仅有手机,平板,还有各式各样的安卓平台,而对于其他安卓平台如安卓家居等,分辨率更是千变万化,为了适应这种百花齐放的需求,所以我们在开发之中有个重中之重的任务就是,Android设备屏幕适配,如果能做到一个完美的适配,无疑是对自己程序的一个锦上添花。

 

要点二:屏幕适配原理如何。

说完为何要屏幕适配,紧接着我们就进入我们的重点,屏幕适配该怎么做,首先我们要明白几个概念,屏幕尺寸,屏幕分辨率以及屏幕像素密度。

屏幕尺寸指的是屏幕的对角线长度,以手机为例,目前我们常见的尺寸有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,即我们此机型的dpi为252。

Android开发屏幕适配_第2张图片

图2

当我们拿到一部需要适配的手机的时候,如果知道了它的dpi,此时我们就可以做适配了。在安卓设备中,我们目前可以分为mdpi、hdpi、xdpi、xxdpi等几种情况,ldpi已经不太常见,针对这几种dpi,我们可以按照图3所示,来判定我们需要适配的设备位于哪个范围。从而根据此不同的dpi进行不同的处理,来实现我们的适配目的。

Android开发屏幕适配_第3张图片

图3

 

要点三:日常开发中针对不同机型以及不同情况使用到的屏幕适配方案。

目前我们开发中能使用到的屏幕适配方法,有以下几种:

  1. 使用不同套图适配
    1. 使用套图适配,目前来说是针对图片适配的最好适配方法,可以防止图片的失真以及变形,但针对不同手机进行不同的套图适配,会对UI人员施加过大的工作压力以及对我们app本身也会造成冗余的影响,我们都知道,图片资源是使我们app变的臃肿罪魁祸首。
    2. 优点:完美适配,不会失真
    3. 缺点:不易达到,app臃肿
  2. 9path适配
    1. 9path图片作为特殊的png图片,可以在特定的情况下对不同机型进行适配,而达到图片不失真的情况。
    2. 优点:①省精力和时间、②省内存、③减少代码量
    3. 缺点:需要每张图片进行制作处理,单一,图片中部分区域不会随整图改变而改变,从而不能完全适合所有图片适配
  3. 布局适配
    1. 使用权重适配
      1. 由图4可以看出,在格局比较明朗的页面中,如果我们能少用具体大小dp值,多用权重,可以在不同的分辨率下都能做到完美适配。但此种适配仅仅局限于格局比较明朗的界面中,如果在一个界面中,有各种嵌套和各种复杂布局,则就显得力不从心了。

Android开发屏幕适配_第4张图片

图4

    1. 使用线性布局、相对布局和帧布局,绝对布局由于适配性极差,所以少使用
    2. 针对纯色背景,尽量使用android的shape自定义
    3. 开发多使用match_parent,而少使用fill_parent,避免日后被淘汰。

 

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

Android开发屏幕适配_第5张图片

图5

    1. 在使用dimens的时候,我们可以在dimens文件中,用px为单位,这样就能达到完美适配。如图6

Android开发屏幕适配_第6张图片

图6

  1. 代码适配
    1. 我们也可以在java文件中,使用java代码进行适配,相比较xml的话,此种适配方法更迅捷。
    2. 通过获取View的参数并结合dimens进行适配
      1. LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)
      2. getResources().getDimension(R.dimen.dimen_1_dip); 

问题扩展

  1. 在代码适配中关于setLayoutParams报错
      1. 在继承BaseAdapter中,getView返回View的时候经常需要代码控制布局适配,需要用到View.setLayoutParams,但是报错类型转换错误。
      2. 不能使用ViewGroup.LayoutParams而必须使用对应父View的LayoutParams类型。如:某View被LinearLayout包含,则该View的setLayoutParams参数类型必须是LinearLayout.LayoutParams。原因在于LinearLayout(或其他继承自ViewGroup的layout,如:RelativeLayout)在进行递归布局的时候,LinearLayout会获取子View的LayoutParams,并强制转换成LinearLayout.LayoutParams。如图7

图7

  1. 定义控件,设置字体大小30sp,从dimens中获取值之后,当屏幕分辨率为320x480,     密度为160dpi,30sp=30dp=30px,后来需要适配480x640的分辨率,密度为240的屏幕, 这时候30sp=30dp=45px,实际上Log出来的值并不是45px,而是67.5px,造成适配不      准。结果如图8,代码如图9、图10

Android开发屏幕适配_第7张图片

图8

图9

Android开发屏幕适配_第8张图片

图10

      1. 由源码可知,在setTextSize方法中,会执行applyDimension方法,用来按照单位进行适配字体。如图11和图12所示,在applyDimension方法中,如果是sp单位,则会在240密度下,30sp=45px,setTextSize函数内部还需要乘以一个scaleDensity,那么setTextSize(30sp)实际设置的大小为:

30spx1sp=45x1.5=67.5px。

Android开发屏幕适配_第9张图片

图11

Android开发屏幕适配_第10张图片

图12

      1. 正确的解决办法:

setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.textsize));

 

更多相关文章

  1. Android日常整理(一)---android返回键、Fragment、android分割线、
  2. android下的定时器在关闭屏幕后会自己停掉解决方法
  3. Android屏幕密度(Density)和分辨率的关系
  4. 【Android Demo】Android中取得手机屏幕大小
  5. Android之手机屏幕朝向
  6. 图片切换
  7. android屏幕旋转在framework中的修改。
  8. android 屏幕上面画线

随机推荐

  1. Tab控件 笔记
  2. android 设置系统屏幕亮度
  3. Android跑指定包Monkey脚本
  4. Android(安卓)虚化图片的方法
  5. Android(安卓)设置StatusBar的颜色
  6. Android全屏设置的两种方式
  7. android之实现ProgressBar进度条组件
  8. Android(安卓)Studio控件技巧汇总
  9. [Android]Activity的创建
  10. Android(安卓)根据账号和密码自动连接 WI