在右侧和下方画出内容显示区。完成绘制之后,选择file-> save ,便可保存为 .9.png 格式的文件,并在android项目中使用。 html
代码动态布局: java
小米3是5英寸,属于layout-large android
2)图片资源方面
须要根据dpi值准备5套图片资源:
drawable:主要放置xml配置文件或者对分辨率要求较低的图片
drawalbe-ldpi:低分辨率的图片,如QVGA (240x320)
drawable-mdpi:中等分辨率的图片,如HVGA (320x480)
drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
drawable-xhdpi:至少960dp x 720dp windows
小米3:主屏分辨率 1920x1080像素 屏幕像素密度 441ppi
工具
Android有个自动匹配机制去选择对应的布局和图片资源。
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
在开发程序时为了兼容不一样平台不一样屏幕,建议各自文件夹根据需求均存放不一样版本图片。
三、AndroidManifest.xml 配置
android从1.6和更高,Google为了方便开发者对于各类分辨率机型的移植而增长了自动适配的功能
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>
3.1是否支持多种不一样密度的屏幕
android:anyDensity=["true" | "false"]
若是android:anyDensity="true"
指应用程序支持不一样密度,会根据屏幕的分辨率自动去匹配。
若是android:anyDensity="false"
应用程序支持不一样密度,系统自动缩放图片尺寸和这个图片的坐标。 布局
具体解释一下系统是如何自动缩放资源的。
例如咱们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种状况都是出如今高密度,以及低密度的手机上,好比说一部240×320像素的手机, 若是设置android:anyDensity="false",Android系统会将240 x 320(低密度)转换为 320×480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。
3.2是否支持大屏幕
android:largeScreens=["true" | "false"]
若是在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统使用尺寸为("normal")和密度为("medium)显示,
不过会出现一层黑色的背景。
3.3是否支持小屏幕
android:smallScreens=["true" | "false"]
若是在声明不支持的小屏幕,而当前屏幕尺寸是smaller的话,系统也使用尺寸为("normal")和密度为("medium)显示
若是应用程序能在小屏幕上正确缩放(最低是small尺寸或最小宽度320dp),那就不须要用到本属性。不然,就应该为最小屏幕宽度标识符设置本属性
来匹配应用程序所需的最小尺寸。 spa
四、Android提供3种方式处理屏幕自适应
4.1预缩放的资源(基于尺寸和密度去寻找图片)
1)若是找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2)若是无法找到相应的尺寸,而找到密度,则认为该图片尺寸为 "medium",利用缩放显示这个图片。
3)若是都没法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
4.2自动缩放的像素尺寸和坐标(密度兼容)
1)若是应用程序不支持不一样密度android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。
2)对于预缩放的资源,当android:anyDensity="false",也不生效。
3)android:anyDensity="false",只对密度兼容起做用,尺寸兼容没效果
4.3兼容更大的屏幕和尺寸(尺寸兼容)
1)对于你在声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为 ("normal")和密度为("medium)显示。
2.)对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统一样使用尺寸为("normal")和密度为("medium)显示,
不过会出现一层黑色的背景。
五、Android系统自动适配技巧
Android系统采用下面两种方法来实现应用的自动适配:
1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样能够保证在屏幕上面展现的时候有合适的大小
2)为不一样屏幕密度的手机,提供不一样的位图资源,可使得界面清晰无缩放。
对应bitmap 资源来讲,自动的缩放有时会形成放大缩小后的图像变得模糊不清,这是就须要应用为不一样屏幕密度配置提供不一样的资源:为高密度的屏幕提供高清晰度的图像等。
3)不要使用AbsoluteLayout
4)像素单位都使用DIP,文本单位使用SP
六、在代码中获取屏幕像素、屏幕密度
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
七、 通常多分辨率处理方法及其缺点
7.1 图片缩放
基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。若是图片不匹配,平台会加载默认资源而且在放大或者缩小以后能够知足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi 中的位图资源),若是没有,平台会将中精度资源缩放至高精度,致使图片显示不清晰。
7.2 自动定义像素尺寸和位置
若是程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160 的屏幕上同样能显示出一样尺寸的效果。例如,要让WVGA 高精度屏幕和传统的HVGA 屏幕同样显示一样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320×480,在(10,10)到(100,100)的区域内绘制图形完成以后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。
7.3 兼容更大尺寸的屏幕
当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480 的,多余的显示区域会被填充成黑色。
7.4 采用OpenGL 动态绘制图片
Android 底层提供了OpenGL 的接口和方法,能够动态绘制图片,可是这种方式对不熟悉计算机图形学的开发者来说是一个很大的挑战。通常开发游戏,采用OpenGL 方式。
7.5 多个apk 文件
Symbian 和传统的J2ME 就是采用这种方式,为一款应用提供多个分辨率版本,用户根据本身的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,可是目前Google Market 对一个应用程序多个分辨率版本的支持还不完善,开发者仍是须要尽量使用一个apk 文件适应多个分辨率。 Android9 patch 图片 (.9.png 格式图片) 的特色和制做
一.9.png格式的文件的特色
与传统的png 格式图片相比, 9.png 格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容
显示区进行定义。这种格式的图片在android 环境下具备自适应调节大小的能力。(1)容许开发人员定义可扩展区域,当须要延伸图
片以填充比图片自己更大区域时,可扩展区的内容被延展。(2)容许开发人员定义内容显示区,用于显示文字或其余内容. 以下图所示:
左侧和上方的黑线交叉的部分便可扩展区域,右侧和下方的黑线交叉的部分即内容显示区.
二 .9.png 图片的制做
android sdk 的 tools文件夹下提供了制做该格式图片的工具 draw9patch.bat。使用此工具打开任意图片以后,将鼠标置于图片上。
被黑色覆盖的是不可编辑(锁住)的区域,周围的一圈一个像素的边沿是可编辑区域。按住鼠标左键,在左侧和上方的边沿画出可扩展区。
.net
在右侧和下方画出内容显示区。完成绘制之后,选择file-> save ,便可保存为 .9.png 格式的文件,并在android项目中使用。 code
代码动态布局: orm
小米3是5英寸,属于layout-large
2)图片资源方面
须要根据dpi值准备5套图片资源:
drawable:主要放置xml配置文件或者对分辨率要求较低的图片
drawalbe-ldpi:低分辨率的图片,如QVGA (240x320)
drawable-mdpi:中等分辨率的图片,如HVGA (320x480)
drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
drawable-xhdpi:至少960dp x 720dp
小米3:主屏分辨率 1920x1080像素 屏幕像素密度 441ppi
Android有个自动匹配机制去选择对应的布局和图片资源。
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
在开发程序时为了兼容不一样平台不一样屏幕,建议各自文件夹根据需求均存放不一样版本图片。
三、AndroidManifest.xml 配置
android从1.6和更高,Google为了方便开发者对于各类分辨率机型的移植而增长了自动适配的功能
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>
3.1是否支持多种不一样密度的屏幕
android:anyDensity=["true" | "false"]
若是android:anyDensity="true"
指应用程序支持不一样密度,会根据屏幕的分辨率自动去匹配。
若是android:anyDensity="false"
应用程序支持不一样密度,系统自动缩放图片尺寸和这个图片的坐标。
具体解释一下系统是如何自动缩放资源的。
例如咱们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种状况都是出如今高密度,以及低密度的手机上,好比说一部240×320像素的手机, 若是设置android:anyDensity="false",Android系统会将240 x 320(低密度)转换为 320×480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。
3.2是否支持大屏幕
android:largeScreens=["true" | "false"]
若是在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统使用尺寸为("normal")和密度为("medium)显示,
不过会出现一层黑色的背景。
3.3是否支持小屏幕
android:smallScreens=["true" | "false"]
若是在声明不支持的小屏幕,而当前屏幕尺寸是smaller的话,系统也使用尺寸为("normal")和密度为("medium)显示
若是应用程序能在小屏幕上正确缩放(最低是small尺寸或最小宽度320dp),那就不须要用到本属性。不然,就应该为最小屏幕宽度标识符设置本属性
来匹配应用程序所需的最小尺寸。
四、Android提供3种方式处理屏幕自适应
4.1预缩放的资源(基于尺寸和密度去寻找图片)
1)若是找到相应的尺寸和密度,则利用这些图片进行无缩放显示。
2)若是无法找到相应的尺寸,而找到密度,则认为该图片尺寸为 "medium",利用缩放显示这个图片。
3)若是都没法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。
4.2自动缩放的像素尺寸和坐标(密度兼容)
1)若是应用程序不支持不一样密度android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。
2)对于预缩放的资源,当android:anyDensity="false",也不生效。
3)android:anyDensity="false",只对密度兼容起做用,尺寸兼容没效果
4.3兼容更大的屏幕和尺寸(尺寸兼容)
1)对于你在声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为 ("normal")和密度为("medium)显示。
2.)对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统一样使用尺寸为("normal")和密度为("medium)显示,
不过会出现一层黑色的背景。
五、Android系统自动适配技巧
Android系统采用下面两种方法来实现应用的自动适配:
1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样能够保证在屏幕上面展现的时候有合适的大小
2)为不一样屏幕密度的手机,提供不一样的位图资源,可使得界面清晰无缩放。
对应bitmap 资源来讲,自动的缩放有时会形成放大缩小后的图像变得模糊不清,这是就须要应用为不一样屏幕密度配置提供不一样的资源:为高密度的屏幕提供高清晰度的图像等。
3)不要使用AbsoluteLayout
4)像素单位都使用DIP,文本单位使用SP
六、在代码中获取屏幕像素、屏幕密度
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
七、 通常多分辨率处理方法及其缺点
7.1 图片缩放
基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。若是图片不匹配,平台会加载默认资源而且在放大或者缩小以后能够知足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi 中的位图资源),若是没有,平台会将中精度资源缩放至高精度,致使图片显示不清晰。
7.2 自动定义像素尺寸和位置
若是程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160 的屏幕上同样能显示出一样尺寸的效果。例如,要让WVGA 高精度屏幕和传统的HVGA 屏幕同样显示一样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320×480,在(10,10)到(100,100)的区域内绘制图形完成以后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。
7.3 兼容更大尺寸的屏幕
当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480 的,多余的显示区域会被填充成黑色。
7.4 采用OpenGL 动态绘制图片
Android 底层提供了OpenGL 的接口和方法,能够动态绘制图片,可是这种方式对不熟悉计算机图形学的开发者来说是一个很大的挑战。通常开发游戏,采用OpenGL 方式。
7.5 多个apk 文件
Symbian 和传统的J2ME 就是采用这种方式,为一款应用提供多个分辨率版本,用户根据本身的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,可是目前Google Market 对一个应用程序多个分辨率版本的支持还不完善,开发者仍是须要尽量使用一个apk 文件适应多个分辨率。