Android布局

作为Android初学者来说布局是至关重要的一块,在此我将这段时间我对Android布局的理解记录下来与君共勉。

对比flutter开发的布局我发现掌握相对布局RelativeLayout和线性布局LinearLayout就能应对绝大多数的情况,使用线性布局实现RowColumn

一、相对布局RelativeLayout

1. 根据父容器来定位(true/false)
//左对齐
android:layout_alighParentLeft

//右对齐
android:layout_alighParentRight

//顶端对齐
android:layout_alighParentTop

//底部对齐
android:layout_alighParentBottom

//水平居中
android:layout_centerHorizontal

//垂直居中
android:layout_centerVertical

//中央位置
android:layout_centerInParent

//如果对应的兄弟元素找不到的话就以父元素做参照物
android:layout_alignWithParentIfMissing 
2. 根据兄弟组件来定位(右面的属性值为兄弟组件的id)
//左边
android:layout_toLeftOf

//右边
android:layout_toRightOf

//上方
android:layout_above

//下方
android:layout_below

//对齐上边界
android:layout_alignTop

//对齐下边界
android:layout_alignBottom

//对齐左边界
android:layout_alignLeft

//对齐右边界
android:layout_alignRight
3.外边距Margin和内边距Padding

Margin:设置组件与父容器(通常是布局)的边距

//指定控件的四周的外部留出一定的边距
android:layout_margin

//指定控件的左边的外部留出一定的边距
android:layout_marginLeft

//指定控件的上边的外部留出一定的边距
android:layout_marginTop

//指定控件的右边的外部留出一定的边距
android:layout_marginRight

//指定控件的下边的外部留出一定的边距
android:layout_marginBottom

Padding:设置组件内部元素间的边距(可以理解为填充)

//指定控件的四周的内部留出一定的边距
android:padding

//指定控件的左边的内部留出一定的边距
android:paddingLeft

//指定控件的上边的内部留出一定的边距
android:paddingTop

//指定控件的右边的内部留出一定的边距
android:paddingRight

//指定控件的下边的内部留出一定的边距
android:paddingBottom

这两个后面都跟着一个参数,通常用dp作为单位,例如

android:margin = "10dp"
4. 图片适配规则android:scaleType

ImageView.ScaleType / android:scaleType值的意义区别:

//按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER /center 

//按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_CROP / centerCrop

//将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
CENTER_INSIDE / centerInside

//把图片按比例扩大/缩小到View的宽度,居中显示
FIT_CENTER / fitCenter 

//把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_END / fitEnd 

//把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_START / fitStart 

//把图片�不按比例扩大/缩小到View的大小显示
FIT_XY / fitXY 

//用矩阵来绘制,动态缩小放大图片来显示
MATRIX / matrix 

⚠️要注意一点,Drawable文件夹里面的图片命名是不能大写的。

二、线性布局LinearLayout

转自张亚运的专栏https://blog.csdn.net/yayun0516/article/details/77887637

Android中的gravity属性有两种形式:layout_gravity和gravity,这两种有什么区别呢?从字面意思上就可以大概理解,第一个layout_gravity控制控件在父布局中的位置(和margin比较类似),gravity可以控制控件中内容的显示位置(和padding比较类似)。(除了上面用到的属性值center之外,一次设置多个属性值用 “|” 隔开)

1. gravity和layout_gravity属性
//置于右侧(线性布局设置垂直时有效)
right

//置于左侧(线性布局设置垂直时有效)
left

//置于上侧(线性布局设置水平时有效)
top

//置于下侧(线性布局设置水平时有效)
bottom

//水平居中(线性布局设置垂直时有效)
center_horizontal

//垂直居中(线性布局设置水平时有效)
center_vertical

//水平垂直方向都居中
center
2. layout_weight属性
(1) layout_width=“match_parent”


 
    
 
    

以下分别为左侧TextView设置

android:layout_weight="5"
img01.jpeg
android:layout_weight="10"
img02.jpeg
android:layout_weight="100"
img03.jpeg
(1) layout_width=“wrap_content”


 
    
 
    

以下分别为左侧TextView设置

android:layout_weight="5"
img04.jpeg
android:layout_weight="10"
img05.jpeg
(3) layout_width=“0dp”

设置layout_width为0dp时才是正确的layout_weight属性使用方法,因为SDK中对layout_weight的使用方法有如下解释:

In order to improve the layout efficiency when you specify the weight, you should change the width of the EditText to be zero (0dp). Setting the width to zero improves layout performance because using "wrap_content"as the width requires the system to calculate a width that is ultimately irrelevant because the weight value requires another width calculation to fill the remaining space.

也就是说,在某个方向上使用layout_weight属性推荐将这个方向上的width设置成0dp,系统将会采用另一套算法来计算控件的控件占比,这时layout_weight属性值和占据的“宽度”将是成正比例。



 
    
 
    

因为布局是水平布局,所以其方向上的width就是layout_width,设置layout_width为0dp

img06.png
2. weightSum属性

上面讲解了layout_weight属性的使用,Android还提供了一个weightSum属性供开发者调用。通过名字直观分析,这个应该是所有layout_weight的和,此属性将在父布局中使用。



 
    

这个weightSum放在父布局中并设置其值为“2”,这时可以认为整个宽为“2”,在子控件TextView中设置layout_weight为“1”并设置其layout_width为0dp,可以认为TextView占据了整个宽的一半

img07.png

可以看出,TextView居中并占据整个宽的一半。两个控件时同样也可以按照比例占据屏幕宽的一半,修改代码如下:



 
    
 
    

设置父布局的weightSum为“6”,将整个屏幕的宽分成6份,设置第一个TextView的layout_weight属性值设为“2”,它将占据2份屏幕的宽,将第二个TextView的layout_weight属性值设为“1”,它将占据1份屏幕的宽,查看预览窗口

img08.png

可以看出,第一个TextView是第二个TextView的宽的两倍,这两个TextView占据整个屏幕的一半。

参考文章
https://blog.csdn.net/nocol123/article/details/53455544
https://blog.csdn.net/yayun0516/article/details/77887637

你可能感兴趣的:(Android布局)