有时需为视图属性指定大小尺寸值(通常以像素为单位,有时也用点、毫米或英寸)。最常见的属性有:
文字大小(text size),指定设备上显示的文字像素高度;
边距(margin),指定视图组件间的距离;
内边距(padding),指定视图外边框与其内容间的距离
Android使用密度修饰drawable目录(如 drawable-xhdpi )下的图像文件自动适配不同像素密度的屏幕。那么问题来了,假如图像完成了自动适配,但边距无法缩放适配,又或者用户配置了大于默认值的文字大小,会发生什么情况呢?
为解决这些问题,Android提供了密度无关的尺寸单位(density-independent dimension unit)。使用这种单位,可在不同屏幕密度的设备上获得同样的尺寸。无需进行麻烦的转换计算,应用运行时,Android会自动将这种单位转换成像素单位。
dp (或 dip )
英文density-independent pixel的缩写,意为密度无关像素。在设置边距、内边距或任何不
打算按像素值指定尺寸的情况下,通常都使用 dp 这种单位。如果设备屏幕密度较高,密
度无关像素会相应扩展至整个屏幕。1 dp 单位在设备屏幕上总是等于1/160英寸。使用 dp
的好处是,无论屏幕密度如何,总能获得同样的尺寸。
sp
英文scale-independent pixel的缩写,意为缩放无关像素。它是一种与密度无关的像素,这
种像素会受用户字体偏好设置的影响。我们通常会使用 sp 来设置屏幕上的字体大小。
pt 、 mm 、 in
类似于 dp 的缩放单位。允许以点(1/72英寸)、毫米或英寸为单位指定用户界面尺寸。但
在实际开发中不建议使用这些单位,因为并非所有设备都能按照这些单位进行正确的尺
寸缩放配置。
在实际开发中,我们往往只会用到 dp 和 sp 两种单位。Android在运行时会自动将它们
的值转换为像素单位
布局参数:你是否已经注意到,有些属性名称以 layout_ 开头,如 android:layout_marginLeft ,而其他属性名称则不是,如 android:text 。不以 layout_ 开头的属性作用于组件。组件实例化时,会调用某个方法按照属性及属性值进行自我配置。
以 layout_ 开头的属性则作用于组件的父组件。我们将这些属性统称为布局参数。它们会告诉父布局如何在内部安排自己的子元素。即使布局对象(如 LinearLayout )是布局的根元素,它仍然是一个带有布局参数的子组件。在 fragment_crime.xml 文件中定义 LinearLayout 时,我们赋予了它两个属性: android:layout_width 和 android:layout_height 。 LinearLayout
实例化时,它的父布局会使用这两个属性。也就是说, CrimeActivity 内容视图里的 FrameLayout 会使用 LinearLayout 的布局参数
边距属性是布局参数,决定了组件间的距离。假设一个组件对外界一无所知,边距必须对该组件的父组件负责。内边距则并非布局参数。属性 android:padding 告诉组件:在绘制组件自身时,要比所含内容大多少。
边距:
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
内边距:
android:padding="80dp"
android:layout_weight 属性的工作原理: