Android屏幕适配 - 屏幕基础理论知识笔记;res资源文件命名与匹配规则

来源:互联网 发布:linux 查看swap 编辑:程序博客网 时间:2024/06/03 16:43

         Android开发中,屏幕适配是十分让人头疼的问题,最近打算好好研究下适配的解决方案,主要参考官方文档及论坛上大神们的方法(我崇拜的鸿洋大神等);首先,先熟悉点基础知识。

常用单位

px:pixel   //像素

in:inch    //英寸

mm: 毫米

pt : 1/72英寸

dpi : dots peer inch //一英寸长的直线上的像素点的数量,即像素密度

dp(dip): Density-independent pixel  //密度无关像素,定义为160dpi的屏幕下,1个像素点的长度

sp: Scale-independent Pixels //专用于设定文字大小,和dp类似,但是它除了收到dpi影响,还受到用户的字体偏好设定影响

屏幕的物理尺寸:屏幕对角线的长度,以inch为单位

分辨率:屏幕上长宽方向上像素点的数量,例如A80为全高清屏,即1080*1920的分辨率  //也称想对分辨率(使用这种说法一般认为,dpi才是真正的分辨率)


android.util.TypedValue类提供了一个函数,支持把所有的单位换算到px,实现代码如下:

    /**      * Converts an unpacked complex data value holding a dimension to its final floating       * point value. The two parameters <var>unit</var> and <var>value</var>      * are as in {@link #TYPE_DIMENSION}.      *        * @param unit The unit to convert from.      * @param value The value to apply the unit to.      * @param metrics Current display metrics to use in the conversion --       *                supplies display density and scaling information.      *       * @return The complex floating point value multiplied by the appropriate       * metrics depending on its unit.       */      public static float applyDimension(int unit, float value,                                         DisplayMetrics metrics)      {          switch (unit) {          case COMPLEX_UNIT_PX:              return value;          case COMPLEX_UNIT_DIP:              return value * metrics.density;          case COMPLEX_UNIT_SP:              return value * metrics.scaledDensity;          case COMPLEX_UNIT_PT:              return value * metrics.xdpi * (1.0f/72);          case COMPLEX_UNIT_IN:              return value * metrics.xdpi;          case COMPLEX_UNIT_MM:              return value * metrics.xdpi * (1.0f/25.4f);          }          return 0;      }  

概括来说对于多设备适配经验的小总结

1,使用简洁的风格来设计UI,让界面变得简单并且一体化,使UI有更好的适应能力。
2,尽量使用match_parent,wrap_content等属性来实现UI的自适应,减少dp的使用,尽量不要使用px。
3,如果使用dp,那么不要在layout文件中显式的设定数值,而是通过dimens文件来引用,不同设备上就可以使用同一份layout,而通过不同的dimens来适配。
4,可以的情况下,尽量使用.9的png文件,通过无损的缩放来适应UI。
5,有些的XML上很难设定的UI细节,可能可以通过Java代码动态调整的方案来解决。
6,如果有需要的话,可以通过w720dp,h360dp,1024*768等属性来对市面上销量检查UI效果。

Res资源文件下命名方式与要求

1,命名不区分大小写;

2,命名形式:资源名-属性1-属性2-属性3-属性4.........

      资源名就是资源类型名,包括:drawable,values,layout,anim,raw,menu,color,animator,xml;

      属性1-属性2-属性3-属性4........就是上述的属性集内的属性,如:-en-port-hdpi

      注意:各属性的位置顺序必须遵守优先级从高到低排列!否则编译不过。

实例说明命名规则

1,把全部属性都用上的例子(各属性是按优先级先后排列出来的)

values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexposed-nonav-v7

2,上面例子的中文说明

values-mcc310(sim卡运营商)-en(语言)-sw320dp(屏幕最小宽度)-w720dp(屏幕最佳宽度)-h720dp(屏幕最佳高度)-large(屏幕尺寸)-long(屏幕长短边模式)-port(当前屏幕横竖屏显示模式)-car(dock模式)-night(白天或黑夜)-ldpi(屏幕最佳dpi)-notouch(触摸屏幕类型)-keysexposed(键盘类型)-nokeys(硬按键类型)-navexposed(方向键是否可用)-nonav(方向键类型)-v7(Android版本)

定位最佳文件夹

1,定位算法

providingResource

特殊说明:关于屏幕大小size相关的属性不在步骤1的过滤清除条件里(dpi属性和screen size属性):

1)对于dpi属性系统的选择方法是best match;即如果没有找到准确的属性,可以接着寻找最接近的属性文件夹。

      例如:g7手机,应该是values-hdpi,但如果没有values-hdpi,则可以找出最接近的文件夹(先找alues-xhdpi到alues-mdpi到alues最后到alues-ldpi,系统认为values比values-ldpi更接近我的values-hdpi属性);


2)对于screen size

属性系统的选择方法是向下best match;即如果没有找到准确的属性,只可以接着在比自身属性小的文件夹里找最近的属性文件夹。例如:g7手机,应该是values-normal,但如果没有values-normal,则可以找出最接近的文件夹(先找values再到values-small,注意,系统认为values比values-small更接近我的values-normal属性,但之后就不会再找values-large与values-xlarge了,因为是向下best match,large与xlarge都比normal大)。


             Android屏幕适配-资源文件夹命名与匹配规则

参考: Android多屏幕适配学习笔记




0 0