安卓适配怎么使用多android values 适配

> 博客详情
如有理解错,希望被指出
单位杂谈:
px(pixel) 屏幕像素
dip(density-independent pixel) 设备独立像素,缩写为dp,可以理解为另外一种标识像素的单位,它与像素存在以下关系:
dip/pixel = dpi/160 =& dip = dpi*pixel/160=&&px = dp * (dpi / 160)& 当dpi=160时&& dip=px
屏幕对角线的长度代表手机的尺寸。
dpi(dot per inch) 表示每英寸像素点有多少,也可以认为是每英寸像素密集度,我们所说的density其实是dpi的估算值,比如165的dpi认为是160的density。
&&&&&& 基准线是160dpi
比如:计算WVGA(800*480)分辨率,3.7英寸的密度DPI,如图1所示
Diagonal pixel表示对角线的像素值(=),DPI=933/3.7=252
根据上面的计算方案,下面计算得出:
QVGA(240X320)&&&&&&&&&&&&&&& 2.7inch&& 148dpi&&& ldpi
HVGA(320x480)&&&&&&&&&&&&&&& 3.2inch&& 180dpi&&& mdpi
QVGA(ADP2)(320X480)&&&& 3.2inch&& 180dpi&&& mdpi
WQVGA(240x400)&&&&&&&&&&& 3.3inch&& 141dpi&&& ldpi
WQVGA(240x432)&&&&&&&&&&&& 3.4inch&& 145dpi&&& ldpi
FWQVGA(480x854)&&&&&&&&&& 3.7inch&& 265dpi&&& hdpi
WXGA()&&&&&&&&&&&&& 4.7inch&& 312dpi&&& xhdpi
WVGA(480x800)&&&&&&&&&&&&&&& 5.1inch&& 183dpi&&& mdpi
FWVGA(480x854)&&&&&&&&&&&&&& 5.4inch&& 181dpi&&& mdpi
Nexus One(480x720)&&&&&&&& 3.7inch&& 270dpi&&& hdpi
Nexus S(480x800)&&&&&&&&&&&&&& 4.0inch&& 233dpi&&& hdpi
从上可见,dpi是由屏幕分辨率和屏幕尺寸一起决定的。
为不同的语言和硬件创建资源:
利用目录结构描述,你可以为指定的语言、地点、硬件配置创建不同的资源。在运行时,安卓利用它自己的动态选择机制动态选着这些值。
在res文件夹内,你可以通过使用一个平行的目录结构指定可选择的资源值。连字符“-”被用来分离指定条件的修饰符。
先举个跨语言的例子:
&& values/
&&&& strings.xml
&& values-fr/&& 法国人
&&&& strings.xml
&& values-fr-rCA/& 法裔加拿大人
&&&& strings.xml
下面列出可用的资源值修饰符:
1.Mobile Country Code(MCC 移动国家编码) 和 Mobile Newwork Code(MNC 移动网络编码)
国家和可选择的网络取决于你当前所使用的SIM卡,MCC:mcc+3个代表国家的数字编码,MNC:mnc+2个代表网络的数字编码,举个例子:mcc234-mnc20,你可以找到这些编码在.
2.语言和区域
语言根据ISO 639-1 指定2个小写字母作为代表,紧接着可选择的区域先以r开头(region)然后根据ISO 3166-1-alpha-2 语言编码,也是2个字母不过是大写,还是举个例子吧:
en(英语),en-rUS(美国英语),en-rGB(GB不知道是哪个国家~。~,大家可以去查找通过维基百科)
3.最小的屏幕宽度
以sw&Dimention value&dp的格式(比如sw600dp,sw320dp…)来指定最小的设备尺寸(宽和高)。那为什么说是最小屏幕宽度?考虑到横竖屏,实质就是宽高的较小值。
用在提供多个布局,安卓选择最接近但是不超过当前屏幕尺寸。
4.有效的屏幕宽度
以w&Dimention value&dp 来表示最小的设备屏幕宽度,比如:w600dp,w320dp,w720dp等,同样也是为了支持多个布局选择,不同于最小的屏幕宽度,有效的屏幕宽度
它跟当前的屏幕宽度做对比(比如当前是横屏的屏幕宽度),安卓选择最接近但是不超过当前屏幕尺寸。
5.有效的屏幕高度
与有效的屏幕宽度类似,表示方法以h&Dimension value&dp.
6.屏幕尺寸
实用大致对照表:
屏幕&&&&&&&&&&&& 宽度&&&&&&&&& 高度&&&&&&&&&& 尺寸&&&&&&&&&&&&&& 大小&&&&&&& 密度&&&&&&&
Type&&&&&&&&&& (Pixels)&&&& (Pixels)&& Range (inches)&&&& Size&&&&&&&& Group
QVGA&&&&&&&&&&& 240&&&&&&&&& 320&&&&&&& 2.6 - 3.0&&&&&&&&&&& Small&&&&&& Low
WQVGA&&&&&&&& 240&&&&&&&&& 400&&&&&&& 3.2 - 3.5&&&&&&&&&& normal&&&& Low
FWQVGA&&&&&& 240&&&&&&&&& 432&&&&&&& 3.5 - 3.8&&&&&&&&&& normal&&&& Low
HVGA&&&&&&&&&&& 320&&&&&&&&& 480&&&&&&& 3.0 - 3.5&&&&&&&&&& normal&&&& Medium
WVGA&&&&&&&&&& 480&&&&&&&&& 800&&&&&&& 3.3 - 4.0&&&&&&&&&& normal&&&& High
FWVGA&&&&&&&& 480&&&&&&&&& 854&&&&&&& 3.5 - 4.0&&&&&&&&&& normal&&&& High
WVGA&&&&&&&&&& 480&&&&&&&&& 800&&&&&&& 4.8 - 5.5&&&&&&&&&&& large&&&&&& Medium
FWVGA&&&&&&&& 480&&&&&&&&& 854&&&&&&&& 5.0 - 5.8&&&&&&&&&& large&&&&&& Medium
大约 2~3 inch 为 small, 3~4 inch 为normal,4~6inch 为large, 大于6为xlarge
因为每个屏幕类型都有不同的尺寸(比如QVGA可能有2~3个尺寸),在平板电脑里更常见,比较好的方式是用前面提到的最小的屏幕宽度和有效的屏幕宽度(高度)来更精确的指定,安卓在检测layout的修饰符,会优先考虑后者。
7.屏幕的方向
port(portrait)、land(landscape)、square(square)
8.Dock Mode 所谓的底座模式?
car(行车模式)、desk (断开底座)
9.Night Mode
这个用来指定是否是夜间模式,night或者notnight,以此我们可以修改一个theme或者color theme来达到效果
10.屏幕像素密度(dpi)
最佳实践方式:给ldpi(120dpi),mdpi(160dpi),hdpi(240dpi),xhdpi(320dpi) 都指定对应的图片资源。
然而你也可以指定nodpi表示不去适配dpi。同样安卓也是选择最接近当前设备dpi的Drawables文件夹。
11.触屏类型
notouch、stylus、finger
12.键盘有效性
One of keysexposed, keyshidden, or keyssoft.
13.键盘输入类型
One of nokeys, qwerty, or 12key.
14.导航键有效性
One of navexposed or navhidden.
15.UI导航类型
nonav,dpad,trackball,wheel
16.平台版本
target API Level,& 以v&API level&& 比如v7. 用来限制资源只能跑在指定API或者更高的设备上。
你可以为任何资源指定多个修饰符,然后以- 分开,任何混合写法都是支持的,但是只能是上面列出的修饰符,还有一点就是每种修饰符只能出现1次。
&&&&&&&& layout-large-land
&&&&&&&& layout-xlarge-port-keyshidden
&&&&&&&& layout-long-land-notouch-nokeys
&&&&&&&& values-rUS-en (out of order)
&&&&&&&& values-rUS-rUK (multiple values for a single qualifier)
注意:安卓如果找不到合适的资源文件夹将会报错,所以通常你需要指定一个默认的文件夹(没有任何修饰符的)。
人打赏支持
码字总数 36398
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥android的多国语言适配_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
android的多国语言适配
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢& & 最近团队再做Android App的屏幕适配,按照官方的办法是layout文件引用dimen变量, 变量放在多个不同分辨率下的dimens.xml文件中,分别放在不同的目录下,./app/src/main/res/values-sw480dp-land/dimens.xml ./app/src/main/res/values-sw600dp-lan……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程240723人阅读
【android 进阶之路】(73)
【Android 快速开发】(11)
转载请标明出处:
大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比。如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率、包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象:
为什么Web页面设计人员从来没有说过,尼玛适配好麻烦?
那么,到底是什么原因,让网页的设计可以在千差万别的分辨率的分辨率中依旧能给用户一个优质的体验呢?带着这个疑惑,我问了下媳妇(前端人员),媳妇睁大眼睛问我:什么叫适配?fc,尼玛,看来的确没有这类问题。后来再我仔细的追问后,她告诉我,噢,这个尺寸呀,我都是设置为20%的~~追根到底,其实就是一个原因,网页提供了百分比计算大小。
同样的,大家拿到UI给的设计图以后,是不是抱怨过尼玛你标识的都是px,我项目里面用dp,这什么玩意,和UI人员解释,UI妹妹也不理解。那么本例同样可以解决Android工程师和UI妹妹间的矛盾~UI给出一个固定尺寸的设计稿,然后你在编写布局的时候不用思考,无脑照抄上面标识的像素值,就能达到完美适配,理想丰不丰满~~。
然而,Android对于不同的屏幕给出的适配方案是dp,那么dp与百分比的差距到底在哪里?
2、dp vs 百分比
我们首先看下dp的定义:
Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
好了,上述这些概念记不记得住没关系,只要记住一点dp是与像素无关的,在实际使用中1dp大约等于1/160inch。
那么dp究竟解决了适配上的什么问题?可以看出1dp = 1/160inch;那么它至少能解决一个问题,就是你在布局文件写某个View的宽和高为160dp*160dp,这个View在任何分辨率的屏幕中,显示的尺寸大小是大约是一致的(可能不精确),大概是 1 inch * 1 inch。
但是,这样并不能够解决所有的适配问题:
呈现效果仍旧会有差异,仅仅是相近而已
当设备的物理尺寸存在差异的时候,dp就显得无能为力了。为4.3寸屏幕准备的UI,运行在5.0寸的屏幕上,很可能在右侧和下侧存在大量的空白。而5.0寸的UI运行到4.3寸的设备上,很可能显示不下。
以上两点,来自参考链接1
一句话,总结下,dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。适配的问题还需要我们自己去做,于是我们可能会这么做:
&?xml version="1.0" encoding="utf-8"?&
name="imagewidth"&120dip&
name="imagewidth"&220dip&
&?xml version="1.0" encoding="utf-8"?&
name="imagewidth"&80dip&
上述代码片段来自网络,也就是说,我们为了优质的用户体验,依然需要去针对不同的dpi设置,编写多套数值文件。
可以看出,dp并没有能解决适配问题。下面看百分比。
这个概念不用说了,web中支持控件的宽度可以去参考父控件的宽度去设置百分比,最外层控件的宽度参考屏幕尺寸设置百分比,那么其实中Android设备中,只需要支持控件能够参考屏幕的百分比去计算宽高就足够了。
比如,我现在以下几个需求:
对于图片展示的Banner,为了起到该有的效果,我希望在任何手机上显示的高度为屏幕高度的1/4
我的首页分上下两栏,我希望每个栏目的屏幕高度为11/24,中间间隔为1/12
slidingmenu的宽度为屏幕宽度的80%
当然了这仅仅是从一个大的层面上来说,其实小范围布局,可能百分比将会更加有用。
那么现在不支持百分比,实现上述的需求,可能需要1、代码去动态计算(很多人直接pass了,太麻烦);2、利用weight(weight必须依赖Linearlayout,而且并不能适用于任何场景)
再比如:我的某个浮动按钮的高度和宽度希望是屏幕高度的1/12,我的某个Button的宽度希望是屏幕宽度的1/3。
上述的所有的需求,利用dp是无法完成的,我们希望控件的尺寸可以按照下列方式编写:
android:text="@string/hello_world"
android:layout_width="20%w"
android:layout_height="10%h"/&
利用屏幕的宽和高的比例去定义View的宽和高。
好了,到此我们可以看到dp与百分比的区别,而百分比能够更好的解决我们的适配问题。
some 适配tips
我们再来看看一些适配的tips
多用match_parent
多用weight
自定义view解决
其实上述3点tip,归根结底还是利用百分比,match_parent相当于100%参考父控件;weight即按比例分配;自定义view无非是因为里面多数尺寸是按照百分比计算的;
通过这些tips,我们更加的看出如果能在Android中引入百分比的机制,将能解决大多数的适配问题,下面我们就来看看如何能够让Android支持百分比的概念。
3、百分比的引入
其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹。
然后我们根据一个基准,为基准的意思就是:
比如480*320的分辨率为基准
宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320
高度为480,将任何分辨率的高度分为480份,取值为y1-y480
例如对于800*480的宽度480:
可以看到x1 = 480 / 基准 = 480 / 320 = 1.5
其他分辨率类似~~
你可能会问,这么多文件,难道我们要手算,然后自己编写?不要怕,下文会说。
那么,你可能有个疑问,这么写有什么好处呢?
假设我现在需要在屏幕中心有个按钮,宽度和高度为我们屏幕宽度的1/2,我可以怎么编写布局文件呢?
android:layout_gravity="center"
android:gravity="center"
android:text="@string/hello_world"
android:layout_width="@dimen/x160"
android:layout_height="@dimen/x160"/&
可以看到我们的宽度和高度定义为x160,其实就是宽度的50%;
那么效果图:
可以看到不论在什么分辨率的机型,我们的按钮的宽和高始终是屏幕宽度的一半。
对于设计图
假设现在的UI的设计图是按照480*320设计的,且上面的宽和高的标识都是px的值,你可以直接将px转化为x[1-320],y[1-480],这样写出的布局基本就可以全分辨率适配了。
你可能会问:设计师设计图的分辨率不固定怎么办?下文会说~
对于上文提出的几个dp做不到的
你可以通过在引入百分比后,自己试试~~
好了,有个最主要的问题,我们没有说,就是分辨率这么多,尼玛难道我们要自己计算,然后手写?
2、自动生成工具
好了,其实这样的文件夹手写也可以,按照你们需要支持的分辨率,然后编写一套,以后一直使用。
当然了,作为程序员的我们,怎么能做这么low的工作,肯定要程序来实现:
那么实现需要以下步骤:
分析需要的支持的分辨率
对于主流的分辨率我已经集成到了我们的程序中,当然对于特殊的,你可以通过参数指定。关于屏幕分辨率信息,可以通过该网站查询:
编写自动生成文件的程序
import java.io.F
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.PrintW
* Created by zhy on 15/5/3.
public class GenerateValueFiles {
private int baseW;
private int baseH;
private String dirStr = "./res";
private final static String WTemplate = "&dimen name=\"x{0}\"&{1}px&/dimen&\n";
private final static String HTemplate = "&dimen name=\"y{0}\"&{1}px&/dimen&\n";
* {0}-HEIGHT
private final static String VALUE_TEMPLATE = "values-{0}x{1}";
private static final String SUPPORT_DIMESION = "320,480;480,800;480,854;540,960;600,4;720,0;768,0;80,60;";
private String supportStr = SUPPORT_DIMESION;
public GenerateValueFiles(int baseX, int baseY, String supportStr) {
this.baseW = baseX;
this.baseH = baseY;
if (!this.supportStr.contains(baseX + "," + baseY)) {
this.supportStr += baseX + "," + baseY + ";";
this.supportStr += validateInput(supportStr);
System.out.println(supportStr);
File dir = new File(dirStr);
if (!dir.exists()) {
dir.mkdir();
System.out.println(dir.getAbsoluteFile());
* supportStr
w,h_...w,h;
private String validateInput(String supportStr) {
StringBuffer sb = new StringBuffer();
String[] vals = supportStr.split("_");
int w = -1;
int h = -1;
for (String val : vals) {
if (val == null || val.trim().length() == 0)
wh = val.split(",");
w = Integer.parseInt(wh[0]);
h = Integer.parseInt(wh[1]);
} catch (Exception e) {
System.out.println("skip invalidate params : w,h = " + val);
sb.append(w + "," + h + ";");
return sb.toString();
public void generate() {
String[] vals = supportStr.split(";");
for (String val : vals) {
String[] wh = val.split(",");
generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));
private void generateXmlFile(int w, int h) {
StringBuffer sbForWidth = new StringBuffer();
sbForWidth.append("&?xml version=\"1.0\" encoding=\"utf-8\"?&\n");
sbForWidth.append("&resources&");
float cellw = w * 1.0f / baseW;
System.out.println("width : " + w + "," + baseW + "," + cellw);
for (int i = 1; i & baseW; i++) {
sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}",
change(cellw * i) + ""));
sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}",
sbForWidth.append("&/resources&");
StringBuffer sbForHeight = new StringBuffer();
sbForHeight.append("&?xml version=\"1.0\" encoding=\"utf-8\"?&\n");
sbForHeight.append("&resources&");
float cellh = h *1.0f/ baseH;
System.out.println("height : "+ h + "," + baseH + "," + cellh);
for (int i = 1; i & baseH; i++) {
sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}",
change(cellh * i) + ""));
sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}",
sbForHeight.append("&/resources&");
File fileDir = new File(dirStr + File.separator
+ VALUE_TEMPLATE.replace("{0}", h + "")
.replace("{1}", w + ""));
fileDir.mkdir();
File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml");
File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml");
PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
pw.print(sbForWidth.toString());
pw.close();
pw = new PrintWriter(new FileOutputStream(layyFile));
pw.print(sbForHeight.toString());
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
public static float change(float a) {
int temp = (int) (a * 100);
return temp / 100f;
public static void main(String[] args) {
int baseW = 320;
int baseH = 400;
String addition = "";
if (args.length &= 3) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
addition = args[2];
} else if (args.length &= 2) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
} else if (args.length &= 1) {
addition = args[0];
} catch (NumberFormatException e) {
System.err
.println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");
e.printStackTrace();
System.exit(-1);
new GenerateValueFiles(baseW, baseH, addition).generate();
同时我提供了jar包,默认情况下,双击即可生成,使用说明:
下载地址见文末,内置了常用的分辨率,默认基准为480*320,当然对于特殊需求,通过命令行指定即可:
例如:基准 1280 * 800 ,额外支持尺寸:1152 * 735;4500 * 3200;
java -jar xx.jar
width,height_width,height
上述格式即可。
到此,我们通过编写一个工具,根据某基准尺寸,生成所有需要适配分辨率的values文件,做到了编写布局文件时,可以参考屏幕的分辨率;在UI给出的设计图,可以快速的按照其标识的px单位进行编写布局。基本解决了适配的问题。
本方案思想已经有公司投入使用,个人认为还是很不错的,如果大家有更好的方案来解决屏幕适配的问题,欢迎留言探讨或者直接贴出好文链接,大家可以将自己的经验进行分享,这样才能壮大我们的队伍~~。
注:本方案思想来自Android Day Day Up 一群的【blue-深圳】,经其同意编写此文,上述程序也很大程度上借鉴了其分享的源码。在此标识感谢,预祝其创业成功!
===&后期更新
Google已经添加了百分比支持库,详情请看:
群号:,欢迎入群
微信公众号:hongyangAndroid
(欢迎关注,第一时间推送博文信息)
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
积分:48025
积分:48025
排名:第58名
原创:200篇
评论:14356条
长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你,欢迎扫一扫。
请勿重复加群,Thx
文章:11篇
阅读:196653
文章:10篇
阅读:114808
文章:67篇
阅读:5702920前端之Android入门(6):屏幕适配 - 前端技术 - 腾讯ISUX
在前几篇文章,我们大致了解了Android开发的一些常规模式和方法,在这个过程中其实我们已经接触到了屏幕适配方面的相关知识,但是并没有深入地讲解这些概念。这篇文章我们将分三个方面进行详细讲解。
一,Android的度量单位
在Android中,定义组件尺寸的单位通常有dp和sp,那么它们跟我们经常使用的px有什么区别呢?
px是Pixels的缩写,是常用的像素单位,对应的是屏幕上的点。
移动设备的尺寸有很多种,它们的屏幕总像素也是不同的,使用px单位的组件尺寸会有不一致的情况。
我们看个例子
可以看出这个加号icon在分辨率较高,尺寸较大的屏幕上反而显得略小
dp(density-independent pixel)是与密度无关的像素单位,也就是dip。它是基于设备屏幕物理密度的抽象单位。1dp 表示屏幕DPI为160时1px的长度。DPI 越高的屏幕,屏幕绘制1dp 需要越多的像素,反之亦然。
我们可以将上个例子的图片宽高设置为30dp
可以看出两个加号icon的尺寸是一致的
sp(scale-independent pixel)是与缩放无关的像素单位。跟dp类似,唯一的不同是,该单位会受系统字体设置的影响,通常用在字体上。
Android在设计规范中规定了字体的常用大小:
使用dp/sp的好处是,无论屏幕DPI如何,组件总能表现一致。
二,Android的布局
在Android开发,为程序定义用户界面布局有以下方法:
在XML 文件定义
在程序代码中实例化布局
使用图形布局工具
以上三种方法各有利弊,我们会根据需求场景来应用不同的布局方式,这里主要讲XML布局。
在XML文件定义组件,可以方便的管理程序的UI部分,并且分离表现和行为,使得代码容易管理阅读和管理,而且可以为不同的屏幕定制XML文件。
常用的布局有Frame Layout , Linear Layout , Relative Layout , List View 和 Grid View。
由于List View 和 Grid View 涉及数据部分,我们放到后面再讲,先从几个简单的开始
Frame Layout
FrameLayout是最简单的布局,添加到这个布局的元素都是层叠的,当前元素会被下一个元素覆盖,相当于CSS中的绝对定位position:absolute。
从 Summary 的 XML Attributes 中可以知道这些属性的信息概要。
几个常用的属性:
android:foreground
设置布局的前景图,前景图不会被子元素覆盖
android:foregroundGravity 设置布局前景图的位置
对于,这里仅有android:layout_gravity属性,可以查看前面文章
我们可以实践一下:
新建一个Android项目,然后在layout文件夹找到布局xml文件并写入以下布局
运行效果如下:
更多详细信息可以查看谷歌大神文档:
Linear Layout
线性布局在前面有所讲解,小伙伴们可以看这篇文章
Relative Layout
相对布局可以指定元素的位置。元素的位置可定义为相邻元素的相对位置(例如元素A在元素B的左侧),也可以定义为父元素的相对位置(例如在父元素的中间或者左侧)。
使用相对布局可以方便的控制元素的位置。在没有定义时,所有的元素都是在父元素的左上方。
从 Summary 的 XML Attributes 中可以知道这些属性的信息概要。
几个常用的属性:
android:gravity 设置其内容(文字、视图)在该元素内的位置
android:ignoreGravity
设置元素的ID使其不受gravity属性的影响
在 ,有两类属性,一类是子元素在父元素的对齐方式,另一类是子元素相对其他元素的位置
下面是第一类属性的示意图
对于第二类属性,我们实践一下:
新建一个Android项目,然后在layout文件夹找到布局xml文件并写入以下布局
然后在values文件夹找到string.xml并增加以下代码
运行效果如下:
更多详细信息可以查看谷歌大神文档:
三,Android的屏幕适配
1.屏幕相关概念
下面介绍几个常见的名词
通过查阅设备信息可以知道设备的物理尺寸,也可以通过计算屏幕对角线的长度得到。
在Android的设计规范中,把屏幕分成了4类:Small,Normal,Large,Extra Large
屏幕在物理尺寸范围内的像素数量。也通常指DPI(dots per inch)。屏幕密度越小,所包含的像素也就越少。
在Android的设计规范中,把屏幕密度划分为4类:Low,Medium,High,Extra High。
屏幕方向有横向和纵向,这两种情况下的屏幕长宽比是不同的。
跟电脑分辨率的概念类似,表示屏幕横纵方向的像素数,例如480*800。
在为APP进行屏幕适配时,不能只考虑到像素,还有屏幕大小,屏幕密度等等。
dots per inch,就是每英寸多少像素,通过下面公式可以得到。
DPI=(√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸
在Android的设计规范中,DPI分成了5个档次:MDPI,HDPI,XHDPI,XXHDPI,XXXHDPI,它们的比例是 2:3:4:6:8
可以看一下不同的尺寸单位在不同屏幕的情况:
XHDPI屏幕(~320DPI)
HDPI屏幕(~240DPI)
MDPI屏幕(~160DPI)
通过以上可以得出:
在MDPI的屏幕(即160DPI),1dp 和1sp 基本等于 1px 。
dp 和 px的换算公式:px = dp*(DPI/160)。
sp 和 px的换算公式:px = sp*(DPI/160)。
2.为不同的屏幕大小提供布局
通常来说,Android通过缩放使得APP可以适应屏幕大小,但是对于一些特殊情况,我们可以提供更佳的布局使得体验更好。例如,在大屏幕设备,可以通过调整UI组件的位置和大小使屏幕的空间可以得到充分利用。对于小设备,就只需要调整UI组件的大小就行。
布局常用的大小有small,normal,large和x-large,可以根据需要选择布局的类型进行配置。
常用的布局配置如下:
res/layout/layout.xml
res/layout-small/layout.xml
res/layout-large/layout.xml
res/layout-large-land/layout.xml
3.为不同的屏幕密度提供图片
对于android来说,可以使用的图片类型有.png,.jpg,.gif以及.9.png(点九图)。APP会为不同的屏幕放大或者缩小图片。如果只为MDPI的设备提供了图片,那么对于HDPI的设备图片会放大,对于LDPI的设备图片会缩小。所以最好的方式是为不同的屏幕密度提供图片。
对于设计师来说,可以选择320DPI作为标准对APP进行设计,然后选择Photoshop/Illustrator这些工具,按照设备的比例,导出不同尺寸的图片。例如,为标准尺寸设备(XHDPI)设计的200x200按钮图,就需要为HDPI设备导出150x150的尺寸,为MDPI设备导出100x100的尺寸
然后将这些图片放到 res/ 中对应的文件夹,APP会根据设备的情况选取图片。
设置如下:
res/drawable-xhdpi/image.png
res/drawable-hdpi/image.png
res/drawable-mdpi/image.png
“点九”是一种特殊的PNG格式,可以对图片指定拉伸区域和内容区域。在SDK里面的 tools/文件夹就能找到制作这种图片的工具。
工具界面如下:
把图片拖拽到工具里面进行加点标记
在图片的左边(A区域左侧)和上边(B区域上方)进行标记,表示该区域可伸缩。
在图片的底边(c区域下方)和右边(D区域右侧)进行标记,表示该区域是内容。
标记完之后,文件在保存的时候会将改为.9.png格式。
使用时,在xml文件中设置android:background=”@drawable/button”。
关于点九的文章前面有同学介绍过:
当然,如果你想偷懒的话,这里有个工具可以帮你点:)
在做屏幕适配时,需要注意以下几个点:
在定义xml布局的时候,使用dp单位,wrap_content,fill_parent(match_parent)
为不同的屏幕密度提供不同的图片
对于有某些规则(渐变)的图片使用点九图
为特殊的屏幕类型(横竖屏)提供不同的布局
对于本节来说,是非常基础的知识,同时,这也是打造精品APP的必备知识,各位加油吧:P
留下你的想法吧}

我要回帖

更多关于 values sw000dp适配 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信