为什么80%的码农都做不了架构师?>>>   

摘要:近年来,智能手机的功能越来越强大,移动终端应用程序层出不穷,移动互联网改变人们的生活。Android系统是开放手机联盟推出的一款开源的手机操作系统,正是由于其开放性,没有采用Windows Phone7类似的硬件限定标准,目前基于Android系统的机型越来越多,一些硬件指标出现了混乱的局面,其中最明显的就是屏幕分辨率的问题。如何使开发者的应用程序尽可能多地适应多种分辨率,正是本文要讲述的问题。文章首先介绍Android的系统架构,然后介绍Android平台中分辨率的相关术语,之后重点讲述在开发过程中如何部署资源以及所应遵循的原则,最后给出测试多分辨率兼容性的方法。

0 引 言

2007 年11 月,Google 公司发布基于Linux2.6 内核的移动终端操作系统- Android, 由于其开源性, 得到很多手机厂商的追捧和应用开发者的青睐。近年来智能手机发展迅速,运行速度、存储容量和可靠性等指标有了显着提高[1],当今的智能手机用户对应用软件的舒适性和美观性有了更大的期望,应用程序界面友好性已经越来越重要。但是由于Android 的开源性,硬件厂商屏幕分辨率不统一,据统计目前市场上Android系统手机的分辨率有10 余种,分辨率分布如此广泛使得开发者在处理多分辨率适应方面遇到了不少难题。文章首先介绍Android 平台的系统架构及资源管理方法,之后介绍目前开发者在处理多分辨率时采用的方法,而后重点分析Android 平台资源加载机制并且结合实例给出多分辨率的处理步骤及技巧,最后介绍测试多分辨率效果的方法。

   1 Android 平台简介

Android 是一个包括操作系统、中间件和关键应用的移动设备软件堆[2],Android 系统和其他系统一样,采用分层的架构。由下至上依此为Linux 操作系统和驱动、程序库及Android 运行时环境、应用程序框架层、应用层。 Android 应用程序的基本组件有Activity、Intent、BroadcaSTReceiver、Service 四种,各个组件的配置信息以及权限管理、版本管理等配置信息都保存在AndroidManifest.xml 中。

1.1 Android 应用程序资源管理

手机界面上加载的图片是Android 资源的一种,除此之外还有XML 资源(anim.xml layout.xml 等) 以及原数据文件( 音视频文件等)[3].新建一个HelloAndroid 的Android 应用程序,默认生成的文件架构包含src,gen,assets,res 等文件夹,以及AndroidManifest.xml 配置文件。src 文件夹中保存的是Android 源代码,res 文件夹代表应用程序需要使用到的资源文件,gen 包中包含R.java 文件。Res 文件夹中包含的所有资源文件都对应在R.java 中。

当开发者在res/ 目录中任何一个子目录中添加相应类型的文件之后,ADT 会在R.java 文件中相应的匿名内部类中国自动生成一条静态int 类型的常量,对添加的文件进行索引。

Android 系统采取这种架构使视图等资源文件与控制代码分离,实现松耦合。然而可以使用R.java 文件在代码中对相应的资源文件进行存取,灵活操作。

1.2 一般多分辨率处理方法及其缺点

1.2.1 图片缩放

基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi 中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。

1.2.2 自动定义像素尺寸和位置

如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160 的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA 高精度屏幕和传统的HVGA 屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320×480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。

1.2.3 兼容更大尺寸的屏幕

当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480 的,多余的显示区域会被填充成黑色。

1.2.4 采用OpenGL 动态绘制图片

Android 底层提供了OpenGL 的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计算机图形学的开发者来讲是一个很大的挑战。一般开发游戏,采用OpenGL 方式。

1.2.5 多个apk 文件

Symbian 和传统的J2ME 就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前Google Market 对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk 文件适应多个分辨率。

2 多分辨率处理方案详解

2.1 基本术语介绍

2.1.1 屏幕尺寸

真正的物理尺寸,屏幕对角线的长度,单位是英寸。为了简化起见,Android 把支持的所有物理尺寸分成了4 组:small,normal, large, extra large.

2.1.2 屏幕密度Density

一定物理范围的像素的个数,单位通常是dpi(dots perinch), 即每英寸的点数。例如一个低分辨率屏幕相对于高分辨率屏幕在一定的物理区域内包含的像素点要少。为了简化起见,Android 将所有的屏幕密度分成四组:low, medium,high 和extra high.

2.1.3 方向Orientation

从用户视角来看的屏幕的方向,Portrait 纵向和Landscape 横向。

2.1.4 分辨率Resolution

屏幕上所有的像素点数目,一般用480*800 的形式来表示。密度无关像素dp: Android 平台中虚拟的像素单位,定义成一种密度无关的形式,像素px 和dp 的转换公式为 px =dp*(dpi/160)。在界面开发中应使用dp 作为像素单位,从而保证在不同的屏幕密度上控件所占的实际px 因密度而自动调整。

2.2 手机屏幕的分类

Android 采用两种标准对屏幕进行分类。按照屏幕尺寸分为四组small, normal, large, extra large;按照屏幕密度分为四组 low, medium ,high 和extra high,其分界线如图1所示。

图1 Android 中的屏幕分类

为了优化程序UI,让其适应多种分辨率并能清晰显示,一般情况下需要为不同屏幕大小密度提供不同的图片文件和对应的布局文件,在运行的时候,Android 系统会根据当前设备的屏幕大小及密度等信息,选择加载其中一套匹配的资源加以运行,从而达到适应多分辨率的效果。

2.3 Android 支持多分辨率原理及步骤

由以上分析,默认的加载方式都不能很好地适应不同的分辨率,Android 从1.6 开始支持多种分辨率的处理,原理简而言之就是根据屏幕参数,动态加载资源文件。在Android 项目文件结构中,drawable 文件夹下包含三个子文件夹,分别为drawable-hdpi, drawable-mdpi, drawable-ldpi, 分别存放hdpi,mdpi,ldip 的位图。应用程序运行时,Android 系统会根据当前设备的屏幕大小、分辨率、屏幕密度、方向、长宽比等信息,选择相应文件夹进行加载。Android 配置修饰符的定义规则如下:

1)在res 文件夹下新建目录,命名为-这种格式,其中为标准资源名称,例如drawable 或者layout;即修饰符,指定对应的屏幕参数,比如normal/small/large,hdpi/mdpi/ldpi,land/port,long/notlong 等。

2)在步骤1 新建的文件夹中存入相应的资源,比如位图资源或者layout 资源,资源文件的名字必须与默认资源文件的名字相同。例如:

3)Android 系统支持多分辨率的机制离不开Android-Manifest.xml 文件的supports-screen 元素,若应用程序要适应多种分辨率,需要将anyDensity 设置为true.

2.4 界面设计技巧

前面的部分已经详细讲解了如何架构应用程序使其更好地适应多种分辨率屏幕,此外,在界面设计和控制中我们还应该掌握一些原则或者技巧,从而使应用程序界面友好、适应性强。

1)在XML layout 文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小。例如,一个view layout_width="100dip",在 HVGA@160 density 的设备上显示100 个px,而在 WVGA@240 density 的设备上显示150 个px,但是所占的物理尺寸时相同的。

2)在Activity 或者其他控制视图加载的代码处,不要使用像素单位的硬编码。

3)不要使用AbsoluteLayout.绝对布局是由AndroidUI toolkit 提供的布局容器中的一种。但是与其他layout 不一样的是,AbsoluteLayout 使用固定的位置表示,使得在不同的屏幕上面显示效果不好,因此AbsoluteLayout 在sdk1.6 及以后的版本中被弃用了。

4)为不同屏幕密度的手机,提供不同的位图资源,可以使得界面清晰无缩放。

   3 多分辨率兼容性测试方案

在产品发行之前,要在所有的目标手机上进行全面的测试。Android SDK 包含了一套测试多分辨率的机制。可以自己定制avd 作为应用程序的测试环境,avd 会模拟真实机器的屏幕大小和密度。例如图2 为模拟器的列表,可以将程序运行在这四个模拟器中进行多分辨率的测试。

图2 虚拟机列表

4 结论

本文介绍Android 平台的体系架构和分辨率相关的术语,详细论述资源加载原理和多分辨率处理的详细流程,最后给出了测试应用程序是否适应多种分辨率的方法。结合本人实践经验进行讲述,内容深入浅出,较完整地论述了如何使应用程序尽可能多地适应多种分辨率屏幕。

转载于:https://my.oschina.net/cjk035/blog/88569

基于Android平台的多分辨率解决方案[图]相关推荐

  1. 基于Android平台的流媒体播放器的设计

    from: 基于Android平台的流媒体播放器的设计 1引 言 随着移动通信技术和多媒体技术的迅速发展,融合手机.网络.多媒体技术为一体的视频监控技术也有了长足的进步,通过移动通信网络提供流媒体服务 ...

  2. 基于android平台的语音机器人服务娱乐系统

    分 类 号:TP311 学校代码:11460 学 号:10130920 本科生毕业论文 基于android平台的语音机器人服务娱乐系统 Robot Entertainment Service Syst ...

  3. android学生个人事物管理系统,基于Android平台的学生个人事务管理系统的设计与实现(整理版).doc...

    DSJKFHJKDH FJDHJKFH KDSJH JKDHF JKDS HKJ HGFDSJHF JHFJK HFKSD JKFJDSKJF DSJF;DS 摘 要 Android智能手机越来越普及 ...

  4. android新闻客户端发展趋势,基于Android平台的新闻客户端设计与实现

    杨苏雯 摘 要 在Android开发平台上,并在JavaWeb开发的PC端新闻网站的基础上结合现在的需求开发了移动版的新闻客户端App,这个系统设计主要分为用户登录验证模块.新闻列表的显示功能模块以及 ...

  5. android新闻客户端实验报告,基于Android平台的新闻客户端设计与实现

    摘 要 在Android开发平台上,并在JavaWeb开发的PC端新闻网站的基础上结合现在的需求开发了移动版的新闻客户端App,这个系统设计主要分为用户登录验证模块.新闻列表的显示功能模块以及新闻内容 ...

  6. 计算机毕业设计基于Android平台的公交线路查询系统app

    基于Android平台的公交线路查询就是一个可以帮助用户便捷的浏览公交信息的公交线路查询的优秀app,手机联网或者通过USB连接电脑下载即可,在手机上安装完成,直接就可以使用,使用者可以通过公交线路查 ...

  7. android控制中心实现,基于Android平台的智能家居系统控制中心的设计与实现

    摘要: 随着科技的发展,人民生活水平的提高,人们对住宅的要求也越来越高,智能家居就是为解决人们的这一要求诞生的.自1984年第一栋智能建筑诞生以来,世界上出现了很多智能家居解决方案,但都或多或少的存在 ...

  8. 基于Android平台的手机安全助手的设计与实现

    1.研究(设计)目的意义及国内外研究状况和应用前景(附参考文献): (一)选题的目的和意义 Android曾经是一家创立于旧金山的公司的名字,该公司于2005年8月份被Google收购,并从此踏上了飞 ...

  9. android 订餐系统,一种基于Android平台手机订餐系统的实现方法

    一种基于Android平台手机订餐系统的实现方法[ 技术领域: ][0001]本发明涉及一种手机订餐系统,能够通过手机上的Android软件实现订餐.[ 背景技术: ][0002]目前已有的网上订餐系 ...

最新文章

  1. Eslint配置文件 `.eslintrc.js`
  2. c语言变量ppt,C语言程序设计-变量.ppt
  3. P1801-黑匣子_NOI导刊2010提高【堆】
  4. matlab能用矩阵操作就不要用for循环
  5. 系统类配置(二)【深度学习装机详细教程-ubuntu16.04下安装cuda9.0+nvidia-384+cudnn7.1.4+tensorflow1.9。】
  6. ap计算机科学ab,AP微积分AB_AP科目介绍|AP考试网
  7. SAP 系统License查看申请及导入
  8. 以后华为鸿蒙也要越狱了,华为EMUI升级鸿蒙后依然可使用太极运行 Xposed 提供多款型号升级...
  9. 双语不用教 下载地址!!!
  10. 不一样的短视频直播软件开发?
  11. JAVA前端修改密码,Java Web版SVN 配置管理工具 2.0 (远道建立仓库,修改密码,设置权限,支持apache等)...
  12. HTML+CSS例子>太极
  13. 水仙花数(所有自幂数)的实现详解-C语言
  14. 新手想开一个传奇该如何操作?开一个传奇必须掌握哪些知识要点
  15. SAP那些事-职业篇-36-从“固定资产清理”科目说开去
  16. 设置常量 java_Java——常量与变量-java变量设置
  17. 局域网千兆网速测试软件,局域网测速工具软件:charIOT
  18. Windows电脑怎么重装系统?超详细教程!装机不再求人!
  19. 教你一招解决百度网盘限速
  20. android_secure写权限,android - android.permission.WRITE_SECURE_SETTINGS,系统应用程序中的权限拒绝 - 堆栈内存溢出...

热门文章

  1. C#连接Oracle数据库的方法(Oracle.DataAccess.Client也叫ODP.net)
  2. MongoDB 条件操作符
  3. plupload 如何控制最小宽度和文件类型及跨域
  4. 傲游5里保存的网址,在傲游4不能同步?外加几句吐槽
  5. 1-jQuery - AJAX load() 方法【基础篇】
  6. javascript常用代码大全
  7. 线性表—单向循环链表
  8. POJ 1789 Truck History
  9. [游戏模版15] Win32 飞机射击
  10. Adobe Creative Suite CS4/CS5 全系列注册机