天天看点

安卓屏幕适配

屏幕参数 几个概念: 1, Screen size 屏幕的尺寸,(屏幕实际大小)即对角线长度(单位inch-英寸)         四种屏幕尺寸分类:: small, normal, large, and xlarge 2, Screen density屏幕密度,即单位长度像素点数(pots/inches), 一块实际的屏幕区域有多少个像素,一般用dpi衡量(每英寸有多少个点)。 相比起medium、high屏幕密度的设备,在一块确定大小的屏幕区域l密度为low的屏幕拥有的像素更少。android把屏幕密度分为4种:low,medium,high,extra high。即ldpi,mdpi,hdpi,xxhdpi 先了解一下屏幕的级别:

屏幕级别: 注意屏幕级别是按照密度分级,和像素没有关系。 如果非要让密度和像素扯上关系,则需要一个参照系,android使用mdpi级别作为标准参照屏幕,也就是说在320*480分辨率的手机上一个密度可以容纳一个像素。然后其他密度级别则在此基础上进行对比。 理想情况下,480*800的屏幕(hdpi)一个密度可以容纳1.5个像素。 物理大小: 单位是英寸而不是像素,也就说一个英寸在任何分辨率下显示的大小都是一样的,但是像素在密度不同的手机里面显示的实际的大小是不一样的(这就是为什么android手机需要适配的原因)。 重点:     假设1像素在160密度下显示1英寸,则1像素在240密度基础上显示大约0.67英寸,在320密度下显示0.5英寸。于是就出现一种情况,在电脑上的一个像素,在不同的手机上看实际的大小不一样。那么怎么让“设计效果”在不同的手机上看起来显示的区域一样呢?     还是假设一个像素在160密度下的显示在一个密度内,也假设就是一英寸。那么需要几个像素才能在240密度级别下显示在一英寸范围内呢?答案是1.5个像素(根据上图的比率换算)。 3,方向(orientation) -  屏幕方向分为landscape(横屏)和portrait(竖屏)。 4, Resolution 分辨率,即屏幕的总像素点数(width * height) 对屏幕进行适配时,一般不关注它的分辨率,只关注它的屏幕大小和密度。         分辨率是指显示器所能显示的像素的多少, 一块屏幕横向有多少个点,竖向有多少个点,相乘之后的数值就是这块屏幕的分辨率(但是为了方便表示屏幕的大小,通常用横向像素×竖向像素的方式来表示 4, Density-independent pixel (dp)独立像素密度, 与密度无关的像素(Density-independent pixel,dp或dip)   为了保证你的UI适合不同的屏幕密度,建议你采用dp来定义程序UI。 标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。

2怎样适配多种屏幕  Android寻找最佳资源原理 1, 排除与设备设置不符合的资源 2, 根据限定词(qualifier)的优先级,按照顺序查找 3, 在限定词下,是否存在资源路径 4, 排除不包含在限定词中的资源路径 5,  继续执行不同的限定词查找,直到找到相应的资源

总结一下: 第一:android:anyDensity="true",系统会依据屏幕密度,自动去找对应的文件夹 第二:android:anyDensity="false", (1)如果drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载 drawable_mdpi文件夹中的资源 (2)如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源。 (3)如果drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有对应的图片资源,那么系统会加载drawable-mdpi文件夹中的资源  drawable-hdpi 该图片即适用于横屏,也适用于竖屏 drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹中的资源 drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源 

自适应屏幕大小 1.在manifest里定义你的程序支持的屏幕类型,相应代码如下:(默认已经全部支持) <supports-screens android:resizeable=["true"| "false"] android:smallScreens=["true" | "false"]   //是否支持小屏 android:normalScreens=["true" | "false"]  //是否支持中屏 android:largeScreens=["true" | "false"]   //是否支持大屏 android:xlargeScreens=["true" | "false"]  //是否支持超大屏 android:anyDensity=["true" | "false"]    //是否支持多种不同密度的屏幕 android:requiresSmallestWidthDp=”integer” android:compatibleWidthLimitDp=”integer” android:largestWidthLimitDp=”integer”/> 2,对不同大小的屏幕提供不同的layout。

比如,如果需要对大小为large的屏幕提供支持,需要在res目录下新建一个文件夹layout-large/并提供layout。当然,也可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。 3,对不同密度的屏幕提供不同的图片。在drawable中,以mdpi为标准(即160dpi)。比例保持为3:4:5:6

应尽量使用点9格式的图片,如需对密度为low的屏幕提供合适的图片,需新建文件夹drawable-ldpi/,并放入合适大小的图片。相应的,medium对应drawable-mdpi /,high对应drawable-hdpi/,extra high对应drawable-xhdpi/。 图片大小的确定:low:medium:high:extra high比例为3:4:6:8。举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra high为96×96

多屏幕适配的4条黄金原则 a.在layout文件中设置控件尺寸时应采用wrap_content,match_parent和dp。能够使用权重的地方尽量使用权重(android:layout_weight),如果是纯色背景,尽量使用android的shape 自定义。        具体来说,设置view的属性android:layout_width和android:layout_height的值时,wrap_content,match_parent或dp比pix更好。相应地,为了使文字大小更好的适应屏幕应该使用sp来定义文字大小。

b.在程序的代码中不要出现具体的像素值。 为了使代码简单,android内部使用pix为单位表示控件的尺寸,但这是基于当前屏幕基础上的。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。

c.不要使用AbsoluteLayout(android1.5已废弃) 。相应地,应使用RelativeLayout。

d.对不同的屏幕提供合适大小的图片

  获取屏幕的大小可以有两种方法: // 方法一: WindowManager manager = getWindowManager(); int width = manager.getDefaultDisplay().getWidth(); int height = manager.getDefaultDisplay().getHeight(); // 方法二: DisplayMetrics dMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dMetrics); int screenWidth = dMetrics.widthPixels; int screenHeight = dMetrics.heightPixels; 

两种获取屏幕分辨率信息的方法: DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //这里得到的像素值是设备独立像素dp

在代码中获取屏幕像素、屏幕密度  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) 

关于切图: 关于切图有几个建议: 第一,长宽最好是3的倍数(根据android的推荐logo图标的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公约数)。 第二,长宽最好是偶数。因为奇数在进行等比压缩的时候可能有问题。 第三,根据上面两条,如果长宽是6的倍数最理想。 第四,如果可以拉伸而不改变设计意图的情况下,比如纯色背景,则使用android的9path工具制作成.9的图片。

.9图片制作 在SDK里的tools文件夹里有一个工具名字为draw9patch 原理: 解决图片失真。*.9.PNG就标准的PNG格式,只是在最外面一 圈额外增加1px的边框,这个1px的边框就是用来定义图片中可扩展的和静态不变的区域。特别说明, left(左)和top(上)边框中交叉部分是可拉伸 部分,未选中部分是静态区域部分。right和bottom(下和右)边框中交叉部分则是内容部分。w 使用.9图制作工具: 图片周围出现了一像素的空隙,这个空隙就是给.9图片划线用的。 在图片的上下左右分别划线 其中,上方和左方的线是控制图片的可拉伸区域的,也就是说,上方的线控制图片中“信”字横向可拉伸,左侧的线控制纵向可拉伸,下方的线和右侧的线控制图片的文本区域,也就是说,如果图片上有text,就会把位置控制在下方和右侧的线围城的区域里。 如果想删除划线,按住shift + 鼠标左键,删除划线。