最新res目录讲解(drawable、layout、values等目录的分辨率和layout的横竖屏,以及values的多语言)
我们建好一个android 的项目后,默认的res下面 有drawable、layout、values等目录
1.drawable目录相关
启开一个新的Android专案后在res资料夹内会有
drawable-hdpi
drawable-mdpi
drawable-ldpi
drawable-xhdpi
drawable-xxhdpi
三个目录,所定义的dpi皆不同
一般來說,ldpi是120,mdpi是160,hdpi是240,xhdpi的dip是320,xxhdpi的是480。
xhdpi是Android 2.2才开始增加的分类;xlarge是Android 2.3才开始增加的分类; tvdip 则是最近的事。
此外
drawable-hdpi 对应的解析度为 WVGA (480x800),FWVGA (480x854),是放高解析度的图片
drawable-mdpi 对应的解析度为 HVGA (320x480),是放中等解析度的图片
drawable-ldpi 对应的解析度为 QVGA (240x320),是放低解析度的图片
Android系统会根据机器的解析度来分辨鉴定对应到相关的资料夹找出对应的图片,什么分辨率就使用对应的drawable下的目录;
2.layout目录相关
在android中要让手机自适应不同分辨率的手机,总的来说有三种方法:
1.一种是代码实现布局
2.一种是多个layout来实现。
3.最后是使用属性layout_weight来实现自适应多个分辨率,但是确定是如果布局较复杂,实现起来比较难控制,复杂。
---------1.普通情况
这里是说res目录当然是说的使用多个layout来自适应分辨率:
其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
----------2.设计到横屏竖屏时
屏幕方向:
横屏竖屏自动切换:
可以在res目录下建立layout-port-800x600和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。
不同分辨率横屏竖屏自动切换:
以800x600为例
可以在res目录下建立layout-port-800x600和layout-land-800x600两个目录
不切换:
以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。
还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。
要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:
在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation="landscape"。
例如(landscape是横向,portrait是纵向):
Java代码:
< xml version="1.0" encoding="utf-8" > <manifest xmlns: android =" android .com/apk/res/ android " package="com.ray.linkit" android :versionCode="1" android :versionName="1.0"> <application android :icon="@drawable/icon" android :label="@string/app_name"> <activity android :name=".Main" android :label="@string/app_name" android :screenOrientation="portrait"> <intent-filter> <action android :name=" android .intent.action.MAIN" /> <category android :name=" android .intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android :name=".GamePlay" android :screenOrientation="portrait"$amp;>amp;$lt;/activity> <activity android :name=".OptionView" android :screenOrientation="portrait"$amp;>amp;$lt;/activity> </application> <uses-sdk android :minSdkVersion="3" /> </manifest>
另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。
而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的 onConfigurationChanged方法。实现方式如下,不需要做太多的内容:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land do nothing is ok } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port do nothing is ok } }
写一个支持多分辨的程序,基于1.6开发的,建立了三个资源文件夹drawable-hdpi drawable-mdpi drawable-ldpi,里面分别存放72*72 48*48 36*36的icon图标文件。当我在G1(1.5的系统)上测试时,图标应该自适应为48*48才对啊,但实际显示的是36*36。怎么才能让其自适应 48*48的icon图标呢
解决办法 drawable-hdpi drawable-mdpi drawable-ldpi改成drawable-480X320 drawable-800X480的多分辨支持的文件夹
3.values目录相关
----------1.多语言:
values目录是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对应的资源文件。
首先我们点击添加Android Xml File按钮,会出现下面的界面:
输入文件名:string.xml,选中Values单选框,并把下面左列表中的Region添加到左边的列表里面,并在Region输入框里输入cn,如下图
这时,上面的消息提示:如果用Region的话,需要使用语言项,和Region一样,我们把Language也添加到右面的列表里面,填入zh,如下图
4.0的是选择Android xml values file,输入名字后,点击next 进行操作,和上面的操作差不多。
点击Finish按钮,资源文件就会建好了,目录:res\values-zh-rCN(其实上面一大堆操作,就是为生成这个目录)
默认生成的string.xml的代码:
< xml version="1.0" encoding="utf-8" > <resources> <string name="hello">Hello World, Test!</string> <string name="app_name">Test-Multilingual</string> </resources>
修改刚刚生成的res\values-zh-rCN目录下的string.xml:
< xml version="1.0" encoding="utf-8" > <resources> <string name="app_name">测试多语言</string> <string name="hello">你好 多语言测试</string> </resources>
多国语言:在res目录下建立不同名称的values文件来调用不同的语言包
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
----------2.多分辨率:
在不同的分辨率下,Android字体大小怎么自适应分辨率的变化?
假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。然后在文件夹 values ,values-320x240 和 values-480x320 下新建xml文件dimens.xml,该xml文件内容如下:
< xml version="1.0" encoding="utf-8" > <resources> <dimen name="btnTextSize">14dip</dimen> </resources>
针对不同的分辨率,btnTextSize的值不同。在布局文件中,用下面的方式引用该值:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/lblSet" style="@style/btntext" android:textSize="@dimen/btnTextSize"> </TextView>
通过这种方法,可以方便设置在不同分辨率下,字体的大小了。当然,不仅仅字体大小,宽和高等其他的一些属性,也可以通过类似的方式来设置
layout中设置图片自适应大小,并且设置最大宽高,当图片的宽高大于设置的最大值时,宽高值为设置的最大值。
<ImageView android:id="@+id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:maxWidth="42dp" android:maxHeight="42dp" android:scaleType="fitCenter" android:layout_marginLeft="3dp" android:src="@drawable/icon" />
关键代码:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="42dp"
android:maxHeight="42dp"
3.values-v11和values-v14文件夹
values-v11代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml
values-v14代表在API 14+的设备上,用该目录下的styles.xml代替res/values/styles.xml
其中API 11+代表android 3.0 +
其中API 14+代表android 4.0 +
比较新的Android版本中附带了一些应用程序可以利用的主题,并在这些平台上运行时,可能要使用这些主题,同时依然要兼容旧的版本。基于不同的平台版本,通过选择定制主题所使用的资源在不同的父主题之间的切换来达到兼容的目的。
例如,以下是用标准的平台默认的亮度主题声明的一个简化的定制主题,它被放在res/values文件夹下的一个XML文件中(通常是res/values/styles.xml):
<stylename="LightThemeSelector"parent="android:Theme.Light">
...
</style>
当应用程序运行在Android3.0(API级别11)或更高的版本上时,针对这个主题要使用比较新的holographic主题,所以,要在res/values-v11的文件夹下的一个XML文件中放入一个可选的主题声明,把它的父主题设置为holographic主题:
<stylename="LightThemeSelector"parent="android:Theme.Holo.Light">
...
</style>
现在就可以像平常一样使用这个LightThemSelector主题了,如果应用程序运行在Android3.0或更高的版本,就会自动的切换到holographic主题。
在R.styleable.Theme类中可以找到用于主题的标准属性列表。
有关提供可选资源的更多信息,如基于平台版本或其他设备配置的主题和布局,可以查看“Providing Resources”文档。
使用平台样式和主题
Android平台提供了一个大的用于应用程序的样式和主题集合。可以在R.style类中找到所有可用的样式。要使用其中列出的样式,就要用一个前缀来替换在样式名中的所有下划线。如,可以用”@android:style/Theme.NoTitleBar”来替代Theme_NoTitleBar。
但是,R.style类文档没有完整的描述样式,因此查看实际的使用这些样式和主题的源代码会更好的帮助理解提供的每种样式属性。为了更好的引用Android的样式和主题,请看下列源代码:
1. Android样式(styles.xml)
2. Android主题(themes.xml)
这两个文件会通过例子帮助你设计,例如,在Android主题的源代码中,能够找到<style name=”Theme.Dialog”>声明。在这个定义中,可以看到所有的Android框架使用的对话框样式属性。