一、android XML资源文件详解 —— 从物理上分析

xiaoxiao2021-02-28  116

转载地址:http://blog.csdn.net/Scotfield_msn/article/details/52455022?locationNum=8 一、android工程文件夹内容介绍     在eclipse下,一个完整的工程具有至少以下的目录结构,并且还可以根据需求人工增加文件夹,比如有时候我的工程师JNI,则会用到.so文件,如果是多媒体app,则有media文件夹,下面会增加截图讲解。          共有三种类型:①文件夹    ② build 文件夹(逻辑)     ③普通 文件。      下面的资源讲解将按照 显示的实体文件夹来进行展开。 1.gen          此目录 为ADT插件自动生成的代码文件保存路径,生成的都是.java类文件,并且在完整的包名下呈现。          注意,本目录下的任何文件不可人工修改任何一行一字,包括注释,否则提示报错!!           特别地,若本工程引用了第三方项目(Android dependencyies,非referenced libraries或者android private libraries),此项目的生成包也会加进来。截图如下:                              本项目包下,有BuildConfig以及R文件,其中 里面的R.java将保存所有的资源ID。           BuildConfig.java里面是ADT自动生成的工程Build信息,简单如上图。          R.java里面有所有可索引的XML资源的16进制的整数int( 32位 )的索引,类里面是自动生成的各类型的内部类(小写),全部完整的内部类有:attr、dimen、bool、color、integer、drawable、id、layout、menu、string、style、styleable。上面截图中打了框框的是几个常用的资源的内部字段,分析可知,所有的命名都是小写以及下划线(以及数字),不可大写,否则R.java文件无法自动生成。 2.bin          此目录下 存放的是工程自动生成的二进制文件、资源打包文件、第三方jar包以及dalvik虚拟机的可执行文件等等。                    其中dexedLibs是存放第三方引用包,这些包都是已经经过选择有用的class被编译好了集合,如果系统没有自动生成某个库的编译后的包,那么程序在运行时会报出ClassNotFoundException错误,所以要保证所有的三方包都被正确编译出来。          res包下的cruch下有系统处理过的各种针对不同屏幕分辨率、屏幕横竖屏、多语言而产生的drawable文件夹,其中的资源将会在对应的真机环境下使用。若某种目录下缺少某些文件,则会造成运行时找不到文件的错误。另外,工程应该根据实际需求去分别在不同环境下放置、设计不同的资源以达到最佳适配。           AndroidManifest.xml是根据项目直接保留下的系统配置文件( 清单文件 )。          apk文件便是工程被编译后生成的包。说明一下,ADT通过Android adb 来调试程序在模拟机或者真机的情况,获得代码在机子上的运行情况。 3.libs          此文件夹是用来存放第三方包,注意,引用第三方包与引用第三方工程是不同的概念!这将在我的另外一篇文章讲解。           4.src          此文件夹是工程用来存放java文件,存放的是源码,不需多言。其中,包的命名以及包的个数由开发者根据需求自己设计。           5.assets          此目录下 可以存放项目中的一些较大的资源文件,例如:图片、音乐、字体、视频、数据等,并且此目录下是可以自定义字目录结构的。 6.res          此目录是Android的相对最重要的的文件夹之一,类型有:drawable.layout.menu.anim.raw.xml.values。注意,文件夹除了values,其他的文件夹如drawable、layout、menu、values、raw、xml必须是指定文件目录名。因为,values目录下是按照name值检索的,而其他目录是按照文件名检索的。           下面分类详解。 ① drawable          存放一切可以绘制出来的资源,包括图片( .png、.9.png、.jpg、.gif )资源、xml资源。           在java中, 可以使用Resources.getDrawable(id)可以获得drawable资源。          此类目录应该按照不同的实际APP真机环境,结合不同的屏幕分辨率放置不同的图片大小资源 ,这将在下一章讲解。           注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在res/raw/目录下,这样可以避免被自动优化。           ② layout          此目录放置所有布局文件,文件内可以是以容器为起标签的布局,也可是只有单个控件的布局。既可以是Android自带的view、viewgroup,也可以是自己定义的view、viewgroup。下截图是4.4.2的自带布局标签。          注意此目录也应该按照不同的横竖屏来分别放置不同布局文件(针对横竖屏以及分辨率),下章详解。           注意:layout 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 ③ values     此目录下讲存放按名(name值)存取的资源,并且分类众多。里面所有的资源都是resource标签下的子标签内容。     类型有:dimen.style.string.color.bool.item.integer.array.integer-array.string-array.attr.declare-styleable 。并且每一 种类型的标签应该放置在不同的文件下(虽然不是按文件名索取),但以便于人工读取。     此目录下的不同值资源应该按照 不同的屏幕分辨率(针对dimens标签)以及 不同的语言(针对string标签)以及不同的API版本(针对style标签) 来分别放置不同的文件,下章详解。 ④ menu           存放定义了应用程序菜单资源的XML文件。正确创建文件的方法:new Folder,名字menu,new Other——Android——XML,选择menu类型,填写名称,确定即可。菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。 ⑤ anim           用于定义动画对象。存放定义了补间动画(tweened animation)或逐帧动画(frame by frame animation)的XML文件。(该目录下也可以存放定义property animations的XML文件,但是最好还是分开存放). ⑥ raw           自定义的一些原生文件所在目录,像音乐、视频等文件格式,任意文件。 存放直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID 也可以用,即R.raw.somefilename,Resources.getRawResource()方法可以获得这些资源。           *res/raw和assets的相同点:           1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。         *res/raw和assets的不同点:           1.res/raw中的文件会被映射到R.Java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。           2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 ⑦ xml           用户自定义的XML文件, 任意的XML文件, 所有的文件在程序运行时编译到应用程序之中,在程序运行时可以使用Resources.getXML()方法获取。 ⑧ animator           存放定义了属性动画property animations(android 3.0新定义的动画框架)的XML文件 7.build(可选)     进行JNI编程时,系统将会用到C、C++文件,这时候要用到.so文件,则可将其放到本目录下。 8.media(可选)     完全自定义的文件夹,放置我的资源。 二、res目录文件夹子文件夹命名规范     在上一章的res目录讲解时,涉及到针对 不同的实际APP真机环境以及使用语言,结合不同的屏幕分辨率放置不同的图片大小资源 ,这将会涉及到一个文件夹的命名规范。     涉及到的res子文件夹有三个:drawable、layout、values. 1. 屏幕分辨率的影响     影响范围: drawable、 layout 、 values(dimen). ①分辨率与屏幕大小等概念:      屏幕分辨率:屏幕分辨率就是手机屏幕的像素点数,指屏幕横竖各有多少个像素,一般描述成屏幕的“宽×高”。安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等,例如720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。      屏幕大小:屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸为5英寸,5寸×2.54厘米/寸=12.7厘米。 屏幕尺寸分为:small,normal,large,xlarge分别表示小,中,大,超大屏。 Google将设备分为small(2~3英寸)、normal(4英寸左 右)、large(5~7英寸)、xlarge(7英寸以上)。                                    屏幕密度:屏幕密度就是每英寸的像素点数,数值越高当然显示越细腻。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。手机可以有相同的分辨率,但屏幕尺寸可以不相同。 屏幕密度分为:ldpi,mdpi,hdpi,xhdpi,它们的标准值分别是:120dpi,160dpi,240dpi,320dpi。下面有详细的尺寸与密度的对照表。      px :是屏幕的像素点, 长度单位,以具体像素为单位。     in :英寸     mm :毫米     pt :磅,1/72 英寸     sp :scaled pixels,主要用于字体显示。同dp相似,但还会根据用户的字体大小偏好来缩放。     dp(= dip ):一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px。 长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度                         dp与px换算公式:                               pixs =dips * (densityDpi/160).                               dips=(pixs*160)/densityDpi ②Android手机屏幕代号以及手机常见分辨率以及对应的(屏幕密度)dpi以及密度值以及drawable文件夹名 QVGA(Quarter VGA):240 x 320;                            ldpi      120dpi             drawable-ldpi      放低解析度的图片 HVGA:320 x 480;                                               mdpi      160dpi           drawable-mdpi   放中等解析度的图片 VGA: 480 x 640                                                                      WVGA:800x480                                            hdpi      240dpi           drawable-hdpi   放高解析度的图片 FWVGA:854x480                                                                     QHD:960x540                                                                          720P:1280x720(标清,standard definition,SD)小米2    xhdpi    320dpi        drawable-xdpi        1080 x 1920                             谷歌 Nexus 4      xxhdpi     480dpi        drawable-xxhdpi   1080P:1920x1080(高清,high definition,HD)             xxxhdpi     640dpi        drawable-xxxhdpi  (只用到 drawable-xxhdpi即可 ) ③drawable文件名 屏幕受 尺寸以及 分辨率的限制,所以drawable必须对尺寸和分辨率都加以判断才能最佳适配。 通过上面的屏幕分辨率的讲解,现对文件名加上限定为资源指定特定的适用平台: 这种限定方式比较适用于对外发布应用,不知道终端具体参数的情况,但是不能做到精确适配,对于屏幕尺寸和密度相差不大的两种平台不能很好的区分。为了解决上述问题,自Android3.2开始,引入了精确适配,理论上可以适配任意像素宽度,高度,屏幕密度的平台,需用以下方式添加限定符: 其中w1280dp表示屏幕宽度为1280dp,h752dp表示屏幕高度为752dp,160dpi表示屏幕密度。其中必须以dp为单位,可通过公式:1dp = (目标屏幕密度/标准密度)*px 转换成dp单位。 ④ values命名 在不同的分辨率下,Android字体大小怎么自适应分辨率的变化?可以在不同的values文件夹下放置不同的字体size(用dp), 如 < dimen   name = "btnTextSize" > 14dip </ dimen >   。 通过这种方法,可以方便设置在不同分辨率下,字体的大小了。当然,不仅仅字体大小,宽和高等其他的一些属性,也可以通过类似的方式来设置 ⑤layout layout中设置图片自适应大小,并且设置最大宽高,当图片的宽高大于设置的最大值时,宽高值为设置的最大值。 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.Java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。 layout最好是最好用match_parent、wrap_content属性,让系统自动适配。 2. 横竖屏的影响     影响范围: layout ①layout 可以在res目录下建立layout-port-800x600和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。 (注:android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation="landscape"。) 3. 多语言的影响     影响范围: values(string). ①values命名 在res目录下建立不同名称的values文件来调用不同的语言包: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-en-rUS 英语(英国):values-en-rGB 英文(澳大利亚):values-en-rAU 英文(加拿大):values-en-rCA 英文(爱尔兰):values-en-rIE 英文(印度):values-en-rIN 英文(新西兰):values-en-rNZ 英文(新加坡):values-en-rSG 英文(南非):values-en-rZA 阿拉伯文(埃及):values-ar-rEG 阿拉伯文(以色列):values-ar-rIL 保加利亚文:  values-bg-rBG 加泰罗尼亚文:values-ca-rES 捷克文:values-cs-rCZ 丹麦文:values-da-rDK 德文(奥地利):values-de-rAT 德文(瑞士):values-de-rCH 德文(德国):values-de-rDE 德文(列支敦士登):values-de-rLI 希腊文:values-el-rGR 西班牙文(西班牙):values-es-rES 西班牙文(美国):values-es-rUS 芬兰文(芬兰):values-fi-rFI 法文(比利时):values-fr-rBE 法文(加拿大):values-fr-rCA 法文(瑞士):values-fr-rCH 法文(法国):values-fr-rFR 希伯来文:values-iw-rIL 印地文:values-hi-rIN 克罗里亚文:values-hr-rHR 匈牙利文:values-hu-rHU 印度尼西亚文:values-in-rID 意大利文(瑞士):values-it-rCH 意大利文(意大利):values-it-rIT 日文:values-ja-rJP 韩文:values-ko-rKR 立陶宛文:valueslt-rLT 拉脱维亚文:values-lv-rLV 挪威博克马尔文:values-nb-rNO 荷兰文(比利时):values-nl-BE 荷兰文(荷兰):values-nl-rNL 波兰文:values-pl-rPL 葡萄牙文(巴西):values-pt-rBR 葡萄牙文(葡萄牙):values-pt-rPT 罗马尼亚文:values-ro-rRO 俄文:values-ru-rRU 斯洛伐克文:values-sk-rSK 斯洛文尼亚文:values-sl-rSI 塞尔维亚文:values-sr-rRS 瑞典文:values-sv-rSE 泰文:values-th-rTH 塔加洛语:values-tl-rPH 土耳其文:values--r-rTR 乌克兰文:values-uk-rUA 越南文:values-vi-rVN  4.不同API版本的影响     影响范围: values(style). ①values命名     比较新的Android版本中附带了一些应用程序可以利用的主题,并在这些平台上运行时,可能要使用这些主题,同时依然要兼容旧的版本。基于不同的平台版本,通过选择定制主题所使用的资源在不同的父主题之间的切换来达到兼容的目的。 values-v11代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml. 其中API 11+代表android 3.0 + values-v14代表在API 14+的设备上,用该目录下的styles.xml代替res/values/styles.xml 其中API 14+代表android 4.0 + 5.综合命名规则 ① drawable、layout、values 可用后缀类型(3种通用): 屏幕密度dpi值   -( hdpi)   屏幕分辨率   -(640x360) 横竖屏    -(port/land) 屏幕尺寸大小  -(small/normal/large/xlarge) 屏幕指定高宽dp值  -(w1280dp/h720dp) ②命名要求 1) 命名不区分大小写; 2) 命名形式: 资源名-属性1-属性2-属性3-属性4-属性5.....     资源名就是资源类型名,包括:drawable, values, layout, anim, raw, menu, color, animator, xml; 属性1-属性2-属性3-属性4-属性5.....     就是上述的属性集内的属性,如:-en-port-hdpi; 注意:各属性的位置顺序必须遵守优先级从高到低排列!否则编译不过 3 )   实例说明: 把全部属性都用上的例子(各属性是按优先级先后排列出来的): values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexposed-nonav-v7 4) 上述例子属性的中文说明: values-mcc310(sim卡运营商)-en(语言)-sw320dp(屏幕最小宽度)-w720dp(屏幕最佳宽度)-h720dp(屏幕最佳高度)-large(屏幕尺寸)-long(屏幕长短边模式)-port(当前屏幕横竖屏显示模式)-car(dock模式)-night(白天或夜晚)-ldpi(屏幕最佳dpi)-notouch(触摸屏模类型)-keysexposed(键盘类型)-nokey(硬按键类型)-navexposed(方向键是否可用)-nonav(方向键类型)-v7(android版本) 5)注意:对于指定分辨率的属性(例如:values-hdpi-1024x600,values-hdpi-960x540,values-mdpi-1024x600),指定分辨率属性并没出现在官网的匹配属性集里,也没找到对于分辨率属性的详细说明,经测试,这个分辨率属性匹配并不准确,例如Galaxy Nexus(1280x720 ),却可以匹配到values-hdpi-1024x600,因此希望最好不使用分辨率属性。
转载请注明原文地址: https://www.6miu.com/read-62667.html

最新回复(0)