最新res目录讲解(drawable、layout、values等目录的分辨率和layout的横竖屏,以及values的多语言)
html
咱们建好一个android 的项目后,默认的res下面 有drawable、layout、values等目录
java
启开一个新的Android专案后在res资料夹内会有android
drawable-hdpi
drawable-mdpi
web
drawable-ldpiapp
drawable-xhdpi框架
drawable-xxhdpi
ide
三个目录,所定义的dpi皆不一样布局
通常來說,ldpi是120,mdpi是160,hdpi是240,xhdpi的dip是320,xxhdpi的是480。
xhdpi是Android 2.2才开始增长的分类;xlarge是Android 2.3才开始增长的分类; tvdip 则是最近的事。
此外
四种分辨率密度分类: ldpi(低,480*320及如下),mdpi(中等,480*320-800*480),hdpi(高,800*480-1280*720),xhdpi(特高,1920*1080),xxhdpi目前仅有Nexus 10使用(2560*1600)
测试
Android系统会根据机器的解析度来分辨鉴定对应到相关的资料夹找出对应的图片,什么分辨率就使用对应的drawable下的目录;字体
在android中要让手机自适应不一样分辨率的手机,总的来讲有三种方法:
1.一种是代码实现布局
2.一种是多个layout来实现。
3.最后是使用属性layout_weight来实现自适应多个分辨率,可是肯定是若是布局较复杂,实现起来比较难控制,复杂。
这里是说res目录固然是说的使用多个layout来自适应分辨率:
其实很简单,只须要在res目录下建立不一样的layout文件夹,好比layout-640x360,layout-800x480,全部的layout文件在编译以后都会写入R.java里,而系统会根据屏幕的大小本身选择合适的layout进行使用。
屏幕方向:
横屏竖屏自动切换:
能够在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="http://schemas.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"></activity>
<activity android:name=".OptionView"
android:screenOrientation="portrait"></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的多分辨支持的文件夹
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>
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
在不一样的分辨率下,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"
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”文档。
http://developer.android.com/guide/topics/resources/providing-resources.html
使用平台样式和主题
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框架使用的对话框样式属性。