Android系统的多分辨率解决方案

2022-04-21 00:05:52孔和昭
导读 大家好,我是本期栏目编辑小友,现在为大家讲解Android系统的多分辨率解决方案问题。 近年来,随着智能手机的快速发展,运行速度、存储容量

大家好,我是本期栏目编辑小友,现在为大家讲解Android系统的多分辨率解决方案问题。

近年来,随着智能手机的快速发展,运行速度、存储容量、可靠性等指标都有了显著提升[1]。如今的智能手机用户对应用软件的舒适性和美观性有了更大的期待,应用程序界面的友好性也变得越来越重要。但由于安卓开源,硬件厂商的屏幕分辨率并不统一。据统计,目前市面上安卓手机的分辨率有10多种,分辨率的广泛分布让开发者在处理多分辨率适配时遇到很多困难。本文首先介绍了安卓平台的系统架构和资源管理方法,然后介绍了目前开发者处理多分辨率的方法,接着重点分析了安卓平台的资源加载机制并结合实例给出了多分辨率的处理步骤和技巧,最后介绍了测试多分辨率效果的方法。

1安卓平台介绍

安卓是一个包括操作系统、中间件和关键应用的移动设备软件栈[2]。安卓系统和其他系统一样,采用分层架构。从下到上,有Linux操作系统和驱动、库和Android运行时环境、应用框架层和应用层。安卓应用程序有四个基本组件:活动、意图、广播接收器和服务。每个组件的配置信息,以及权限管理和版本管理的配置信息都存储在AndroidManifest.xml中

1.1安卓应用资源管理

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

当开发人员在res/directory的任何子目录中添加相应类型的文件时,ADT会在R.java文件的相应匿名内部类中自动生成一个静态int类型的常量来索引添加的文件。

安卓系统采用这种架构,将视图等资源文件与控制代码分离,实现松耦合。但是,可以使用R.java文件来访问代码中相应的资源文件,这使得操作更加灵活。

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

1.2.1图像缩放

根据当前屏幕的精度,平台会自动加载任何尺寸和精度有限的未缩放图片。如果图片不匹配,平台会加载默认资源,放大或缩小后满足当前界面的显示要求。比如目前的高精度屏幕,平台会加载高精度资源(比如HelloAndroid中的drawable-hdpi中的位图资源),如果不加载,平台会将中精度资源缩放到高精度,导致画面显示不清晰。

1.2.2自动定义像素大小和位置。

如果程序不支持多精度屏幕,平台会自动定义像素的绝对位置和大小值,以保证元素能够显示出与160精度屏幕相同的大小效果。比如让WVGA高精度屏幕显示和传统HVGA屏幕一样大小的图片,当程序不支持时,系统会骗程序说屏幕分辨率是320倍;40,在从(10,10)到(100,100)的区域绘制图形后,系统会将图形放大到屏幕显示区域从(15,15)到(150,150)。

1.2.3与大屏幕兼容

当当前屏幕超过程序支持的屏幕上限时,定义supportsscreens元素,这样当超过显示的基线时,平台将在此显示黑色背景图像。比如在WVGA的精准度屏幕上,如果程序不支持这么大的屏幕,系统会谎称是320倍;40,额外的显示区域将填充黑色。

1.2.4用OpenGL动态绘制图片

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

1.2.5多个apk文件

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

2多分辨率处理方案详解

2.1基本术语介绍

2.1.1屏幕尺寸

真正的物理尺寸,屏幕的对角线长度,以英寸为单位。为了简单起见,安卓将所有支持的物理尺寸分为四组:小、普通、大、超大。

2.1.2屏幕密度

特定物理范围内的像素数,通常以dpi(点围)为单位,即每英寸点数。例如,低分辨率屏幕在特定物理区域中包含的像素比高分辨率屏幕少。为了简单起见,

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 系统会根据当前设备的屏幕大小及密度等信息,选择加载其中一套匹配的资源加以运行,从而达到适应多分辨率的效果。

近年来智能手机发展迅速,运行速度、存储容量和可靠性等指标有了显着提高[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&TImes;480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。

1.2.3 兼容更大尺寸的屏幕

当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320&TImes;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 系统会根据当前设备的屏幕大小及密度等信息,选择加载其中一套匹配的资源加以运行,从而达到适应多分辨率的效果。

技术专区 睿赛德科技喜迁新址 ,RT-Thread进入新的加速发展阶段 可靠性高、控制灵活、低功耗可调速风扇散热系统 安防监控摄像头LED驱动解决方案 如何定制嵌入式Linux发行版 基于SoC实现的数据采集系统详解

免责声明:本文由用户上传,如有侵权请联系删除!