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));

Android开发屏幕适配相关推荐

  1. Android开发屏幕适配全攻略

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  2. Android开发——Android手机屏幕适配方案总结

    0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博 ...

  3. Android的屏幕适配

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  4. android – 多屏幕适配相关

    android – 多屏幕适配相关 作者: 曲天日期: 2011/10/27 1.基本概念 屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸).a ...

  5. Android TV 屏幕适配

    Android TV 屏幕适配 1 1.dpi ,dip(dp), density 几个比较难描述的概念,摘这个blog的: http://www.cnblogs.com/wader2011/arch ...

  6. android相机横屏竖屏,GitHub - qixuefeng/CameraAdapt: Android相机屏幕适配

    CameraAdaptDemo Android相机屏幕适配 该项目主要是为了做相机下的屏幕适配 具体思路可以参见我的这篇文章 Android 相机屏幕适配 测试: 机型:华为荣耀8 (厂商:honor ...

  7. Android AutoSize屏幕适配中图标及字体放大的问题解决

    现象: 项目接入Android AutoSize屏幕适配框架,项目本身主界面是横屏操作的界面.测试中用户反馈在vivo x27的手机或者其他机型也会出现(没测试出来)横屏后所有的图标及字体都放大. 原 ...

  8. Android开发图标适配手机方案

    Android开发图标适配手机方案 在Android入门的时候并没有太多考虑上述问题,甚至在做案列的时候图片或者图标显示在手机上是比较模糊,这对于用户来说是非常影响使用舒适度的. 解决方案如下: 先准 ...

  9. Android多屏幕适配-手机

    1.常用单位及其关系 px:像素 inch:英寸 pt:1/72 英寸 dpi:一英寸长的直线上的像素点的数量,即像素密度.不同的设备,dpi值不同,显示效果不同,dpi的值跟设备硬件有关.标准值是1 ...

  10. android多屏幕适配资源生成,android – 多屏幕适配相关

    1.基本概念 屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸).android把屏幕分为以下4种:small,normal,large,extr ...

最新文章

  1. Nature子刊:用16S及18S rRNA全长进行微生物多样性研究
  2. 循环节长度 java,第六届蓝桥杯java试题-循环节长度
  3. httpsrequest java_java如何通过https返回数据
  4. php递归多维数组为缩进列表,php – 缩进列表到多维数组
  5. solr7.4 安装与使用
  6. 【数学】异或(jzoj 2298)
  7. Unsigned 陷阱
  8. 时间选择插件Foundation datepicker
  9. 5G让万物互联成为可能 大连接时代谋划物联网
  10. 简述Python类中的 __init__、__new__、__call__ 方法
  11. 使用opencv的nonfree模块
  12. Activiti工作流画图工具介绍
  13. java mail authen,javaxmail发送邮件:用Authenticator的子类进行身份验证及策略模式(Strategy)...
  14. 手机上将mp4转换成amv_如何在Linux上将tiff图像从RGB颜色转换为CMYK颜色?
  15. iphone邮件服务器 263,在iphone上怎么设置263邮箱
  16. 【微信公众号】6、SpringBoot整合WxJava创建自定义菜单
  17. 北航外国语学院计算机项目,北京航空航天大学外国语学院游学项目.pdf
  18. Mybatis的学习
  19. PPT中的声音文件(完美版)
  20. 计算机末端网络,计算机线缆末端的圆球是什么?

热门文章

  1. 林子雨大数据软件安装和编程指南导航
  2. 数论基础——扩展欧几里得【详细】
  3. linux ping 某个端口,linux 怎么ping 端口
  4. 系统自动化制作工资条,很简单,还能发送短信息
  5. 【转】推荐系统算法总结(一)
  6. 中国遥感卫星地面站存档数据目录服务系统
  7. STM8S003F3 uart的使用
  8. 第九章 软件项目风险管理
  9. 使用PYQT5打开海康威视工业相机并获取图像进行显示
  10. Js 获取浏览器高度