[android] 相对布局和单位简介

/**********************2016年4月23日 更新*******************************/

知乎:为何Android的默认布局是RelativeLayout?而不是LinearLayout

无论是Eclipse还是Android Studio,新建Blank Activity时默认的layout都是RelativeLayout,

查询资料发现这是由

android-sdk\tools\templates\activities\BlankActivity\root\res\layout\activity_simple.xml.ftl 这个文件定义的,也就是说这是Google的选择,而非IDE的选择。

我想知道的是为什么是RelativeLayout而不是LinearLayout?如果有可靠的数据支持的话再好不过,先谢过。

猫叔:

Google的意思是“性能至上”, RelativeLayout 在性能上更好,因为在诸如 ListView 等控件中,使用 LinearLayout 容易产生多层嵌套的布局结构,这在性能上是不好的。而 RelativeLayout 因其原理上的灵活性,通常层级结构都比较扁平,很多使用LinearLayout 的情况都可以用一个 RelativeLayout 来替代,以降低布局的嵌套层级,优化性能。所以从这一点来看,Google比较推荐开发者使用RelativeLayout,因此就将其作为Blank Activity的默认布局了。

李板溪:

你可以去看 Google I/O 中 Android 的 Session

或者 Android 的文档。

不过基本可以总结成以下3点:

1. RelativeLayout 布局灵活一些。

2. 实现复杂的布局时,由于 RelativeLayout 所需要的嵌套层次少,所以可能大概也许性能会好一些。 但是你应该根据实际情况测试,主观判断不准确,请参考下面第三点。

3. 对于简单的布局,或者使用 LinearLayout 的嵌套布局层次不多的情况下。还是推荐 使用 LinearLayout 来实现。 因为 LinearLayout 布局性能更高一点,为什么? 因为 RelativeLayout 布局需要至少计算两次。

知乎:px、dp、dip、dpi、sp 等到底有什么联系区别?产生的根源和设计时的影响如何?是否屏幕密度的决定原因?

王拓翔:

从UI设计师的角度理解:

px(像素)是我们UI设计师在PS里使用的(不解释),同时也是手机屏幕上所显示的(也不解释)

dp是开发写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp总为1:1关系。

Android支持四种不同的dpi模式:ldpi mdpi hdpi xhdpi

一般地,手机分辨率与所运行的dpi模式是匹配的,例如hvga(320x480像素)的手机屏幕一般在3.5英寸左右,运行在mdpi模式下(也有例外,稍后解释)(这个是ROM控制的,app不能改变)。当运行在mdpi下时,1dp=1px:也就是说设计师在PS里定义一个item高48px,开发就会定义该item高48dp;Photoshop中14px大的字体,开发会定义为14sp。

对于一部wvga(480x800)手机(G7、N1、NS),一般是运行在hdpi模式下。当运行在hdpi模式下时,1dp=1.5px:也就是说设计师在PS里定义一个item高72px,开发就会定义该item高48dp;Photoshop中21px大的字体,开发会定义为14sp。

所以,当你的app需要适配多个dpi模式的时候(例如同时适配mdpi与hdpi),若你在wvga下做设计,你需要将你的各数值都为3的倍数,并在切图标注时将所有的数字除以3乘以2换算成dp,这样开发的同一套layout就能用在两个不同的dpi模式下,而不是写两套layout。

mdpi与hdpi是2:3的关系

mdpi与xhdpi是1:2的关系

ldpi与mdpi是3:4的关系

Galaxy Nexus 是720P屏幕,就是运行在xhdpi下的。

可以想见为什么iOS的开发者升级到 Retina Display 是多么的无痛

再补充一种例外,有些比较山寨的Pad有可能是7英寸屏幕,分辨率为wvga(480x800)运行在mdpi下,所以一部wvga手机是320x533dp,一部wvga平板是480x800dp,可以显示的内容会多很多。

/********************************************************************/

相对布局一般就是控制控件与控件之间的相对位置来定位,如果不设置都是默认以屏幕的左上角的对齐

常见: 位置,对齐

layout_blow 在某控件的下面   layout_above 在某控件的上面

Layout_toRightOf 在某控件的右面 layout_toLeftOf 在某控件的左面

Layout_centerInParent 在父控件的*

Layout_centerHorizontal 在父控件水平方向剧中

Layout_centerVerital  在父控件垂直方向剧中

与同级别对齐,与父控件对齐

Layout_alignRight 与某控件右边对齐

Layout_alignParentBottom 与父控件底部对齐

Layout_marginLeft  layout_marginTop 页边距

Layout_textColor=”#66000000” 支持透明度 argb第一个是透明度

单位:

dp==dip  单位像素密度,在不同分辨率的手机上会自动进行变化,比例显示一致

px  在不同分辨率的手机上会显示一致,因此有时会感觉app的比例不对

sp 实际所代表的大小和dp一致,为了对文字缩放防止锯齿特意制定

测试代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="80dp"
tools:context="com.tsh.commonlayout.MainActivity" > <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textColor="#000000"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="我是大文本" />
<TextView
android:layout_below="@id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#66000000"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="我是小文本" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
上一篇:Mysql在linux下载、安装详情,附带mysql安装包路径


下一篇:鼠标悬浮,闪烁动画;绑定变量,闪烁动画