/**********************2016年4月23日 更新*******************************/
知乎:为何Android的默认布局是RelativeLayout?而不是LinearLayout
无论是Eclipse还是Android Studio,新建Blank Activity时默认的layout都是RelativeLayout,
查询资料发现这是由
android-sdk ools emplatesactivitiesBlankActivity oot eslayoutactivity_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>