[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
        android:textSize="25sp"
        android:textColor="#000000"
        android:layout_marginLeft="10dp"
        android:layout_marginTop
        android:text="我是大文本" />
    android:layout_below="@id/tv_title"="20sp"="#66000000"
        android:layout_marginRight="我是小文本" CheckBox 
        android:layout_width
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        />
</RelativeLayout>

 

相关文章

AdvserView.java package com.earen.viewflipper; import an...
ImageView的scaleType的属性有好几种,分别是matrix(默认)...
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win1...
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由main...
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件...
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项...