关于android 的屏幕自适应问题
2014-09-06 10:24
183 查看
基本概念:
屏幕尺寸
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。
简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
屏幕长宽比
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和 notlong。
分辨率
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序一般并不直接处理分辨率。
密度
以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。
密度无关的像素( DIP )
指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。我们强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。
VGA,QVGA,HVGA,WVGA
这些术语都是指屏幕的分辨率。
VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素;
HVGA:Half-size VGA,即:VGA的一半,分辨率为480×320,像三星盖世AceS5830就是使用这分辨率;
QVGA:Quarter VGA,即:VGA的四分之一,分辨率为320×240,一般用于小屏手机
WQVGA:Wide Quarter VGA,即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272;
WVGA:Wide Video GraphicsArray,即:扩大的VGA,分辨率为800×480像素
Android 默认的显示设备是HVGA屏幕(640*480分辨率),屏幕密度为160dpi(DPI是“dot perinch”的缩写,每英寸像素数)。
在Android2.1之前,开发应用时只有一个放图片资源的drawable文件夹,这样程序在不同屏幕密度的手机上运行时,系统只会从drawable这个文件夹下调图片资源,并且系统会默认认为这个文件夹下的所有资源是为mdpi屏幕提供的,所以在hdpi屏幕上系统会按比例将drawable下的图片扩大为原来的1.5倍,在ldpi屏幕上系统会按比例将drawable下的图片缩小为原来的0.75倍。这样会大大降低页面效果。
在Android2.1以及之后,出现了drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi。在这些文件下提供的图片大小最好是3:4:6:8:12。程序在不同的屏幕密度下运行时,会首先去符合当前屏幕密度的文件夹下找对应的资源,如果没有,系统会以最省力为前提去别的文件夹下找对应的资源并对其进行相应的缩放,如果还没有,就回去默认的drawable文件夹下找,然后按照2.1之前的规则缩放。如果还没有找到,应用就会报错或者直接crash掉了。
举个例子:现在有一个ldpi的手机屏幕,有一个应用在其上运行(假如只有ldpi、mdpi、hdpi还有drawable四个存放图片的文件夹),并需要调用一个图片a.png(在下文中用a来代替a.png)。Android系统会经历以下流程:
注:
将hdpi中的图片大小缩小为原来的一半相比将mdpi中的图片大小缩小为原来的3/4,计算机要省力,只需进行简单地右移一位操作。所以系统在ldpi下找不到a的时候会首先去hdpi下去找。当存在xhdpi、xxhdpi时,系统会按相同的规则去调用资源。
Drawable-ldpi 3、Drawable-mdpi 4、Drawable-hdpi 6中的3、4、6指的是同一个图片在三个文件夹下的大小之比。
ldpi、mdpi、hdpi、xhdpi的屏幕密度分别为:120dpi 160dpi 240dpi 320dpi。
注意android是根据屏幕的密度到各个不同的文件夹下加载图片资源的,不是根据屏幕的分辨率。所以在开发的时候,我们可以先为主流的中精度屏幕设计一套icon,确定图片的像素尺寸。
为高精度屏幕将图片放大到150%,为低精度屏幕将图片缩小至75%。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi。在这些文件下提供的图片大小最好是3:4:6:8:12
为了做到对于屏幕的更好适应,应该:
1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent,或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小
2)不要使用AbsoluteLayout
3)像素单位都使用dp,文本单位使用sp
屏幕尺寸
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。
简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
屏幕长宽比
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和 notlong。
分辨率
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序一般并不直接处理分辨率。
密度
以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。
密度无关的像素( DIP )
指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。我们强烈推荐你用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。
VGA,QVGA,HVGA,WVGA
这些术语都是指屏幕的分辨率。
VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素;
HVGA:Half-size VGA,即:VGA的一半,分辨率为480×320,像三星盖世AceS5830就是使用这分辨率;
QVGA:Quarter VGA,即:VGA的四分之一,分辨率为320×240,一般用于小屏手机
WQVGA:Wide Quarter VGA,即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272;
WVGA:Wide Video GraphicsArray,即:扩大的VGA,分辨率为800×480像素
Android 默认的显示设备是HVGA屏幕(640*480分辨率),屏幕密度为160dpi(DPI是“dot perinch”的缩写,每英寸像素数)。
在Android2.1之前,开发应用时只有一个放图片资源的drawable文件夹,这样程序在不同屏幕密度的手机上运行时,系统只会从drawable这个文件夹下调图片资源,并且系统会默认认为这个文件夹下的所有资源是为mdpi屏幕提供的,所以在hdpi屏幕上系统会按比例将drawable下的图片扩大为原来的1.5倍,在ldpi屏幕上系统会按比例将drawable下的图片缩小为原来的0.75倍。这样会大大降低页面效果。
在Android2.1以及之后,出现了drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi。在这些文件下提供的图片大小最好是3:4:6:8:12。程序在不同的屏幕密度下运行时,会首先去符合当前屏幕密度的文件夹下找对应的资源,如果没有,系统会以最省力为前提去别的文件夹下找对应的资源并对其进行相应的缩放,如果还没有,就回去默认的drawable文件夹下找,然后按照2.1之前的规则缩放。如果还没有找到,应用就会报错或者直接crash掉了。
举个例子:现在有一个ldpi的手机屏幕,有一个应用在其上运行(假如只有ldpi、mdpi、hdpi还有drawable四个存放图片的文件夹),并需要调用一个图片a.png(在下文中用a来代替a.png)。Android系统会经历以下流程:
注:
将hdpi中的图片大小缩小为原来的一半相比将mdpi中的图片大小缩小为原来的3/4,计算机要省力,只需进行简单地右移一位操作。所以系统在ldpi下找不到a的时候会首先去hdpi下去找。当存在xhdpi、xxhdpi时,系统会按相同的规则去调用资源。
Drawable-ldpi 3、Drawable-mdpi 4、Drawable-hdpi 6中的3、4、6指的是同一个图片在三个文件夹下的大小之比。
ldpi、mdpi、hdpi、xhdpi的屏幕密度分别为:120dpi 160dpi 240dpi 320dpi。
注意android是根据屏幕的密度到各个不同的文件夹下加载图片资源的,不是根据屏幕的分辨率。所以在开发的时候,我们可以先为主流的中精度屏幕设计一套icon,确定图片的像素尺寸。
为高精度屏幕将图片放大到150%,为低精度屏幕将图片缩小至75%。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi。在这些文件下提供的图片大小最好是3:4:6:8:12
为了做到对于屏幕的更好适应,应该:
1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent,或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小
2)不要使用AbsoluteLayout
3)像素单位都使用dp,文本单位使用sp
相关文章推荐
- [UI控件问题] android屏幕自适应 android 属性
- 关于Android设备下的屏幕适配问题
- 暂时解决了Android webview组件中显示SVG自适应屏幕问题
- Android 中 WebView 与 js 简单交互实现图文混排效果,解决图片自适应屏幕与查看大图问题
- 关于自适应屏幕,设置子元素浮动,父div不能包裹子div,子元素中内容溢出的问题。
- Android 关于处理手机屏幕自适应时,用到的主要方法
- 【重头学习Android】关于UI切图和屏幕适配问题
- 关于android旋转屏幕时activity重建和android 转屏 onConfigurationChanged 不会执行的问题
- Android 屏幕自适应问题和9切图
- android 屏幕自适应问题
- android:屏幕自适应问题
- 关于android屏幕适配的问题
- [UI控件问题] android屏幕自适应 android 属性
- android之关于屏幕适配问题
- Android关于屏幕适配问题
- 关于android分辨率兼容(屏幕适配)问题
- 关于Delphi xe5 firemonkey 手机屏幕自适应程序问题
- android 屏幕自适应问题
- 关于自适应屏幕,设置子元素浮动,父div不能包裹子div,子元素中内容溢出的问题。
- 关于android屏幕适配的问题(drawable-xxxxxxxx,dp,sp,px等等),偶尔看到了android源码,关于dpi的区分的值