你的位置:首页 > 操作系统

[操作系统]android下面res目录


1. 相关文件夹介绍
     在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的。assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像     res文件夹里面的多个文件夹的各自介绍(来自网上的Android开发指南中文版内容):

目录Directory

资源类型Resource Types

res/anim/

res/drawable/

 

res/drawable-hdpi/

 

res/drawable-ldpi/

 

res/drawable-mdpi/

 

res/drawable-xhdpi/

 

res/drawable-xxhdpi/

 

res/drawable-zh/

 

res/drawable-en-rUS-port-hdpi/

.png、.9.png、.jpg文件,它们被编译进以下的Drawable资源子类型中:

要获得这种类型的一个资源,可以使用Resource.getDrawable(id)

位图文件

9-patches(可变尺寸的位图)

为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId)

注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在res/raw/目录下,这样可以避免被自动优化。

 

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

Aphone一般到drawable-hdpi去取图片,drawable-hdpi没有图片再到drawable-mdpi去取图片,而后再到drawable-ldpi取图片

Apad一般到drawable-mdpi去取图片,drawable-hdpi没有图片再到drawable-ldpi去取图片

横屏含有drawable-land- hdpi、drawable-land- mdpi、drawable-land-ldpi的区别:

Aphone一般到drawable-land-hdpi去取图片,drawable-land-hdpi没有图片再到drawable-land-mdpi去取图片,而后再到drawable-land-ldpi取图片,而后才会到drawable-hdpi去取图片,drawable-hdpi没有图片再到drawable-mdpi去取图片,而后再到drawable-ldpi取图片

Apad一般到drawable-land-mdpi去取图片,drawable-land-hdpi没有图片再到drawable-land-ldpi去取图片,而后才会到drawable-mdpi去取图片,drawable-hdpi没有图片再到drawable-ldpi去取图片

 

-finger    用于触摸屏的设备

-hdpi    近似于240dpi的高级显示密度的屏幕

-mdpi    近似于160dpi的中级显示密度的屏幕

-ldpi    近似于120dpi的低级显示密度的屏幕

-land    横屏显示

-port    竖屏显示

-long    比较长的屏幕,例如WQVGA(432×240), WVGA(800×480), FWVGA(854×480)

 

drawable-en:英文设置下的图片资料,drawable-zh中文设置下的图片资料。
若是要为不合像素的手机筹办的话,须要(以drawable-en为例申明)
:drawable-en-hdpi
:drawable-en-ldpi
:drawable-en-mdpi
同理:为美式英语,
:drawable-en-rUS-hdpi
:drawable-en-rUS-ldpi
:drawable-en-rUS-mdpi

 

//竖屏

:drawable-en-rUS-port-hdpi
:drawable-en-rUS-port-ldpi
:drawable-en-rUS-port-mdpi
//横屏
:drawable-en-rUS-land-hdpi
:drawable-en-rUS-land-ldpi
:drawable-en-rUS-land-mdpi

建树这些文件夹是有次序的。即按优先级别分列的,见下表。所以建树文件夹时一般从左到右的分列其优先级别如:drawable-en-rUS-land-mdpi
如:drawable-en-rUS-port-160dpi-finger-qwerty-dpad-480 x320/


res/layout/

res/layout-land/
 
res/layout-port/
 
res/layout-land-1024x720 /
 
res/layout-port-976x768 /
如下目录:
layout
layout-land
layout-port
layout-land-1024x720 //1024x768横屏
layout-port-976x768     //1024x768竖屏

注意事项:
在android3.0之前版本,要适配指定的分辨率,需将layout文件夹定义成如下名称:
 
layout  
layout-1024x768   
layout-1024x600   
layout-1280x768 
 
但是,在android3.0后,要适配如上的分辨率,需将高度减去48像素,即底部状态栏的高度,android方可识别。针对以上分辨率,android4.0的layout文件夹应该定义为如下名称:
 
layout  
layout-1024x720   
layout-1024x552  
layout-1280x720 
 
还有一种情况 如果是平板,有可能是竖屏的,需要是
 
layout  
layout-976x768   
layout-976x600   
layout-976x768 

 

格式如上。用法与正常的相同。手机会根据分辨率,自己找对应的布局,不用控制,
只需在res下按上述方式,新建对应layout就可以。

 
 
注意的是分辨率中大的数字必须写到前面,否则会产生语法错误。
如layout-768x1024 的写法是错误的。

 
注意格式,【layout】-【port/land】-【长度x宽度】
 
如何限定横屏或者竖屏?

有些人讨厌玩手机的时候横竖屏来回的切换,有些应用也限定了应用程序只使用横屏或者只使用竖屏,即使手机设置了“自动切换横竖屏”。比如“水果忍者”是不能竖屏的(双人模式除外了)

解决办法:只需要在AndroidManifest.

android:screenOrientation="landscape"表示横屏

android:screenOrientation="protrait"表示竖屏

这样,所设定的应用程序就只能是横屏或者竖屏了


 


res/values/

 

res/values-ldpi/
res/values-mdpi/
res/values-hdpi/
res/values-xhdpi/
res/values-nodpi/
res/values-nodpi-1024×600/
res/values-nodpi-1280×800/
res/values-nodpi-800×480/

res/values-en-rUS/

可以被编译成很多种类型的资源的

注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。

尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中):

      array.

     colors.

     dimens.

      strings.

      styles.

 

以添加一个 英语(美国):values-en-rUS 为例

1、把下面左列表中的Region添加到左边的列表里面,并在Region输入框里输入us

2、这时,上面的消息提示:如果用Region的话,需要使用语言项,和Region一样,我们把Language也添加到右面的列表里面,填入en

3、点击Finish按钮,资源文件就会建好了,目录:/res/values-en-rUS(其实上面一大堆操作,就是为生成这个目录

android多国语言文件夹文件汇总如下:

Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及
Arabic, Israel (ar_IL) -------------------------------阿拉伯语,以色列
Bulgarian, Bulgaria (bg_BG) ---------------------保加利亚语,保加利亚
Catalan, Spain (ca_ES) ---------------------------加泰隆语,西班牙
Czech, Czech Republic (cs_CZ) -----------------捷克语,捷克共和国
Danish, Denmark(da_DK) ------------------------丹麦语,丹麦
German, Austria (de_AT) -------------------------德语,奥地利
German, Switzerland (de_CH) -------------------德语,瑞士
German, Germany (de_DE) ----------------------德语,德国
German, Liechtenstein (de_LI) ------------------德语,列支敦士登的
Greek, Greece (el_GR) ----------------------------希腊语,希腊
English, Australia (en_AU) -------------------------英语,澳大利亚
English, Canada (en_CA) --------------------------英语,加拿大
English, Britain (en_GB) ----------------------------英语,英国
English, Ireland (en_IE) -----------------------------英语,爱尔兰
English, India (en_IN) --------------------------------英语,印度
English, New Zealand (en_NZ) ---------------------英语,新西兰
English, Singapore(en_SG) --------------------------英语,新加坡
English, US (en_US) -----------------------------------英语,美国
English, Zimbabwe (en_ZA) --------------------------英语,津巴布韦
Spanish (es_ES) ----------------------------------------西班牙
Spanish, US (es_US) -----------------------------------西班牙语,美国
Finnish, Finland (fi_FI) ---------------------------------芬兰语,芬兰
French, Belgium (fr_BE) -------------------------------法语,比利时
French, Canada (fr_CA) -------------------------------法语,加拿大
French, Switzerland (fr_CH) --------------------------法语,瑞士
French, France (fr_FR) --------------------------------法语,法国
Hebrew, Israel (he_IL) ---------------------------------希伯来语,以色列
Hindi, India (hi_IN) -------------------------------------印地语,印度
Croatian, Croatia (hr_HR) ----------------------------克罗地亚语,克罗地亚
Hungarian, Hungary (hu_HU) ------------------------匈牙利语,匈牙利
Indonesian, Indonesia (id_ID) ------------------------印尼语,印尼
Italian, Switzerland (it_CH) ----------------------------意大利语,瑞士
Italian, Italy (it_IT) ---------------------------------------意大利语,意大利
Japanese (ja_JP) ----------------------------------------日语
Korean (ko_KR) ------------------------------------------朝鲜语
Lithuanian, Lithuania (lt_LT) --------------------------立陶宛语,立陶宛
Latvian, Latvia (lv_LV) ---------------------------------拉托维亚语,拉托维亚
Norwegian-Bokmol, Norway(nb_NO) ---------------挪威语,挪威
Dutch, Belgium (nl_BE) --------------------------------荷兰语,比利时
Dutch, Netherlands (nl_NL) ---------------------------荷兰语,荷兰
Polish (pl_PL) -------------------------------------------波兰
Portuguese, Brazil (pt_BR) ---------------------------葡萄牙语,巴西
Portuguese, Portugal (pt_PT) ------------------------葡萄牙语,葡萄牙
Romanian, Romania (ro_RO) ------------------------罗马尼亚语,罗马尼亚
Russian (ru_RU) ----------------------------------------俄语
Slovak, Slovakia (sk_SK) ------------------------------斯洛伐克语,斯洛伐克
Slovenian, Slovenia (sl_SI) ---------------------------斯洛文尼亚语,斯洛文尼亚
Serbian (sr_RS) ----------------------------------------塞尔维亚语
Swedish, Sweden (sv_SE) ----------------------------瑞典语,瑞典
Thai, Thailand (th_TH) --------------------------------泰语,泰国
Tagalog, Philippines (tl_PH) --------------------------菲律宾语,菲律宾
Turkish, Turkey (tr_TR) -------------------------------土耳其语,土耳其
Ukrainian, Ukraine (uk_UA) --------------------------联合王国
Vietnamese, Vietnam (vi_VN) -----------------------越南语,越南
Chinese, PRC (zh_CN)--------------------------------中文,中国
Chinese, Taiwan (zh_TW)-----------------------------中文,台湾

res/

任意的

res/raw/

直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename


 

2.自动生成的R class

     在项目文件夹的gen文件夹里面有个R.java,我们平常引用的资源主要引用这个类的变量。
 
     注意:R类是自动生成的,并且它不能被手动修改。当资源发生变动时,它会自动修改。
 

3. 在代码中使用资源

下面是一个引用资源的语法:
R.resource_type.resource_name  或者 android.R.resource_type.resource_name
 
其中resource_type是R的子类,保存资源的一个特定类型。resource_name是在name属性,或者有其他文件类型为资源定义的文件名(不包含扩展名,这指的是drawable文件夹里面的icon.png类似的文件,name=icon)。 Android包含了很多标准资源,如屏幕样式和按钮背景。要在代码中引用这些资源,你必须使用android进行限定,如android.R.drawable.button_background
 
下面是官方给出的一些在代码中使用已编译资源的正确和错误用法的例子:
  1. // Load a background for the current screen from a drawable resource. 
  2. this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image); 
  3.  
  4. // WRONG Sending a string resource reference into a  
  5. // method that expects a string. 
  6. this.getWindow().setTitle(R.string.main_title); 
  7.  
  8. // RIGHT Need to get the title from the Resources wrapper. 
  9. this.getWindow().setTitle(Resources.getText(R.string.main_title)); 
  10.  
  11. // Load a custom layout for the current screen. 
  12. setContentView(R.layout.main_screen); 
  13.  
  14. // Set a slide in animation for a ViewFlipper object. 
  15. mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,  
  16.         R.anim.hyperspace_in)); 
  17.  
  18. // Set the text on a TextView object. 
  19. TextView msgTextView = (TextView)findViewByID(R.id.msg); 
  20. msgTextView.setText(R.string.hello_message);  
       查了SDK Doc,才明白为什么window.setTitle要先Resources.getText,原来setTitle的参数是CharSequence,Resources.getText(int)返回的是CharSequence;而其他setText的参数有的是CharSequence,有的是int(这就是Resources变量值)。
 
同时官方还给了两个使用系统资源的例子:
  1. //在屏幕上显示标准应用程序的图标
  2. public class MyActivity extends Activity { 
  3.     public void onStart() { 
  4.         requestScreenFeatures(FEATURE_BADGE_IMAGE); 
  5.         super.onStart(); 
  6.         setBadgeResource(android.R.drawable.sym_def_app_icon); 
  7.     } 
  8.  
  9. //应用系统定义的标准"绿色背景"视觉处理 
  10. public class MyActivity extends Activity 
  11.     public void onStart() { 
  12.         super.onStart(); 
  13.         setTheme(android.R.style.Theme_Black); 
  14.     } 
 

4. 1) 引用自定义的资源
       android:text="@string/hello"
       这里使用"@"前缀引入对一个资源的引用--在@[package:]type/name形式中后面的文本是资源的名称。在这种情况下,我们不需要指定包名,因为我们引用的是我们自己包中的资源。type是
  1. <?
  2. <resources> 
  3.     <string name="hello">Hello World, HelloDemo!</string> 
  4. </resources> 
 
2) 引用系统资源
       android:textColor="@android:color/opaque_red"   指定package: android
 
3) 引用主题属性
        另外一种资源值允许你引用当前主题中的属性的值。这个属性值只能在样式资源和        android:textColor="?android:textDisabledColor"
    
        注意,这和资源引用非常类似,除了我们使用一个"?"前缀代替了"@"。当你使用这个标记时,你就提供了属性资源的名称,它将会在主题中被查找--因为资源工具知道需要的属性资源,所以你不需要显示声明这个类型(如果声明,其形式就是?android:attr/android:textDisabledColor)。除了使用这个资源的标识符来查询主题中的值代替原始的资源,其命名语法和"@"形式一致:?[namespace:]type/name,这里类型可选。
 

5. 替换资源(为了可替换的资源和配置)

    个人理解这个替换资源主要用于适应多种规格的屏幕,以及国际化。对于这部分的内容,请参考http://androidappdocs.appspot.com/guide/topics/resources/resources-i18n.html,以后再研究! 
 

6. Color Value

语法:
  1. <color name="color_name">#color_value</color> 
可以保存在res/values/colors.Java引用: int color = Resources.getColor(R.color.color_name)
 
其中#color_value有以下格式(A代表Alpha通道):
#RGB
#ARGB
#RRGGBB
#AARRGGBB
 
  1. <?
  2. <resources> 
  3.     <color name="opaque_red">#f00</color> 
  4.     <color name="translucent_red">#80ff0000</color> 
  5. </resources> 
 

7.Color Drawables

语法:
  1. <drawable name="color_name">color_value</drawable> 
可以保存在res/values/colors.java引用:Drawable redDrawable = Resources.getDrawable(R.drawable.color_name)
 
color_name和上面的一样。个人认为,一般情况下使用color属性,当需要用到paintDrawable时才使用drawable属性。


 
  1. <?
  2. <resources> 
  3.     <drawable name="opaque_red">#f00</drawable> 
  4.     <drawable name="translucent_red">#80ff0000</drawable> 
  5. </resources> 
 

8. 图片

      一般放在res/drawable/里面。官方提示png (preferred), jpg (acceptable), gif (discouraged),看来一般使用png格式比较好!
java引用 R.drawable.some_file     引用是不带扩展名
 

9. dimension

语法:
  1. <dimen name="dimen_name">dimen_value单位</dimen> 
一般保存为res/values/dimen.度量单位:
px(象素): 屏幕实际的象素,常说的分辨率1024*768pixels,就是横向1024px, 纵向768px,不同设备显示效果相同。
 
in(英寸): 屏幕的物理尺寸, 每英寸等于2.54厘米。
 
mm(毫米): 屏幕的物理尺寸。
 
pt(点)  : 屏幕的物理尺寸。1/72英寸。
 
dp/dip  : 与密度无关的象素,一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。但dp和px的比例会随着屏幕密度的变化而改变,不同设备有不同的显示效果。
 
sp      : 与刻度无关的象素,主要用于字体显示best for textsize,作为和文字相关大小单位。
 
Java: float dimen = Resources.getDimen(R.dimen.some_name)
 
  1. <?
  2. <resources> 
  3.     <dimen name="one_pixel">1px</dimen> 
  4.     <dimen name="double_density">2dp</dimen> 
  5.     <dimen name="sixteen_sp">16sp</dimen> 
  6. </resources> 
 

10. string

下面是官方给出的正确/错误的例子:
  1. //不使用转义符则需要用双引号包住整个string 
  2. <string name="good_example">"This'll work"</string> 
  3.  
  4. //使用转义符 
  5. <string name="good_example_2">This\'ll also work</string> 
  6.  
  7. //错误 
  8. <string name="bad_example">This won't work!</string> 
  9.  
  10. //错误 不可使用html转义字符 
  11. <string name="bad_example_2">
     对于带格式的string,例如在字符串中某些文字设置颜色,可以使用html标签。对于这类型的string,需要进行某些处理,在
  1. <?
  2. <resources> 
  3.     <string name="simple_welcome_message">Welcome!</string> 
  4.     <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string> 
  5. </resources> 
  1. <TextView 
  2.     android:layout_width="fill_parent" 
  3.     android:layout_height="wrap_content" 
  4.     android:textAlign="center" 
  5.     android:text="@string/simple_welcome_message"/> 
Java代码
  1. // Assign a styled string resource to a TextView on the current screen. 
  2. CharSequence str = getString(R.string.styled_welcome_message); 
  3. TextView tv = (TextView)findViewByID(R.id.text); 
  4. tv.setText(str); 
    另外对于带风格/格式的string的处理,就麻烦一点点。官方给了一个例子:
  1. <?
  2. <resources> 
  3.   <string name="search_results_resultsTextFormat">%1$d results for &lt;b>&amp;quot;%2$s&amp;quot;&lt;/b></string> 
  4. </resources> 
这里的%1$d是个十进制数字,%2$s是字符串。当我们把某个字符串赋值给%2$s之前,需要用htmlEncode(String)函数处理那个字符串:
  1. //title是我们想赋值给%2$s的字符串 
  2. String escapedTitle = TextUtil.htmlEncode(title); 
 然后用String.format() 来实现赋值,接着用fromHtml(String) 得到格式化后的string:
  1. String resultsTextFormat = getContext().getResources().getString(R.string.search_results_resultsTextFormat); 
  2. String resultsText = String.format(resultsTextFormat, count, escapedTitle); 
  3. CharSequence styledResults = Html.fromHtml(resultsText); 
 

11. assets文件夹资源的访问

       assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
      1. 先在Activity里面调用getAssets()来获取AssetManager引用。
      2. 再用AssetManager的open(String fileName, int accessMode)方法则指定读取的文件以及访问模式就能得到输入流InputStream。 
      3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close()
      4.调用AssetManager.close()关闭AssetManager。

需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作
以下为从Raw文件中读取:
代码
    public String getFromRaw(){ 
            try { 
                InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));
                BufferedReader bufReader = new BufferedReader(inputReader);
                String line="";
                String Result="";
                while((line = bufReader.readLine()) != null)
                    Result += line;
                return Result;
            } catch (Exception e) { 
                e.printStackTrace(); 
            }             
    } 
以下为直接从assets读取
代码
    public String getFromAssets(String fileName){ 
            try { 
                 InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) ); 
                BufferedReader bufReader = new BufferedReader(inputReader);
                String line="";
                String Result="";
                while((line = bufReader.readLine()) != null)
                    Result += line;
                return Result;
            } catch (Exception e) { 
                e.printStackTrace(); 
            }
    } 
当然如果你要得到内存流的话也可以直接返回内存流!

 

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目录下可以再建立文件夹