Android开发屏幕适配

问题说明

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

 

答题技巧

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

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

回答要点

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

 

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

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

图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。

图2

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

图3

 

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

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

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

图4

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

 

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

图5

    1. 在使用dimens的时候,我们可以在dimens文件中,用px为单位,这样就能达到完美适配。如图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

图8

图9

图10

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

30spx1sp=45x1.5=67.5px。

图11

图12

      1. 正确的解决办法:

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

 

更多相关文章

  1. androidのEditTex详细使用
  2. android下的定时器在关闭屏幕后会自己停掉解决方法
  3. android studio使用说明
  4. 智能电视使用什么操作系统?
  5. 於 Intel® 架構加速 Android* 模擬器
  6. 使用Docker编译Android系统内核
  7. Android(安卓)selector状态选择器的使用详解
  8. Android(安卓)SQLite框架greenDAO的使用
  9. KJFrameForAndroid

随机推荐

  1. android studio不会导入及出现各种问题怎
  2. Android之Shape和state_enabled使用总结
  3. PHP 即将来到 Google Android?
  4. Android(安卓)Push Notification实现信息
  5. android:layout_gravity 和 android:grav
  6. android:layout_gravity和android:gravit
  7. Android主流三方库源码分析(五、深入理解R
  8. Android(安卓)内核剖析
  9. Android电话拨打流程源码分析
  10. android 开发资源