目的
- 了解Android布局,学习如何使用他们,明白其布局方式
- 使用所学布局知识,完成图像解锁demo
Android布局
概念
布局就是主要把界面中的控件按照某种规律摆放在指定的位置;主要是为了解决应用程序在不同手机中的显示问题
布局种类
- AbsoluteLayout(绝对布局)
- FrameLayout(框架布局/帧布局)
- LinearLayout(线性布局)
- RelativeLayout(相对布局)
- TableLayout(表格布局)
- ConstraintLayout(约束布局)
今天所讲解的是FrameLayout(框架布局/帧布局)、LinearLayout(线性布局)、RelativeLayout(相对布局)以及ConstraintLayout(约束布局)
帧布局 FrameLayout
帧布局是将所有的子元素放在整个界面的左上角,后面的子元素直接覆盖
前面的子元素,所以用的比较少
属性
- android:foreground: 设置改帧布局容器的前景图像
- android:foregroundGravity: 设置前景图像显示的位置
使用方法
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal">
<View
android:layout_width="300dp"
android:layout_height="300dp"
android:background="@color/colorAccent"
/>
<View
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorPrimary"
/>
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorPrimaryDark"/>
</FrameLayout>
效果如下:
线性布局 LinearLayout
线性布局是按照水平或垂直的顺序将子元素(可以是控件或布局)依次按照顺序排列
,每一个元素都位于前面一个元素之后
方向 Orientation
线性布局分为两种——水平方向和垂直方向的布局
系统默认采用横向布局
- Vertical(竖向)
从左到右
android:orientation=”horizontal”
代码实例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorAccent"/>
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorPrimary"/>
</LinearLayout>
效果如下:
- Horizontal(横向)
从上到下
android:orientation=”vertical”
代码实例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal">
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorAccent"/>
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorPrimary"/>
</LinearLayout>
效果如下:
对齐方式
线性布局里有两种设置边距的方式,分别是Margin和Padding
Margin:控件边缘和其他控件的间距,即外间距
Padding:控件内部内容和控件自己边缘的间距,即内间距
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal">
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
/>
<View
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorPrimary"
android:layout_marginLeft="100dp"
android:layout_marginTop="100dp"/>
</LinearLayout>
红色的箭头表示的是Margin,而黑色的箭头表示的是Padding;在线性布局中,各个控件不会重叠
,因为它们依照顺序排布
权重 layout_weight
LinearLayout 支持使用 android:layout_weight 属性为各个子视图分配权重。此属性根据视图应在屏幕上占据的空间量向视图分配“重要性”值。 权重值更大的视图可以填充父视图中任何剩余的空间。子视图可以指定权重值,然后系统会按照子视图声明的权重值的比例,将视图组中的任何剩余空间分配给子视图。
默认权重为零。
android:layout_weight 表示子元素占据的空间大小的比例。分配权重值,其值越小,权重越大。
其计算方法大致如图:
使用方法
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal">
<View
android:layout_width="wrap_content"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:layout_weight="1"/>
<View
android:layout_width="wrap_content"
android:layout_height="100dp"
android:background="@color/colorPrimary"
android:layout_weight="2"/>
</LinearLayout>
效果如下:
相对布局 RelativeLayout
相对布局是在页面内,以控件之间相对位置
或相对父容器位置
进行排列。同时,必须确定控件的x和y坐标以及长和宽
注意:在引用其他子元素之前,引用的ID必须已经存在,否则将出现异常。
属性
使用方法
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/iv_1"
android:layout_width="300dp"
android:layout_height="200dp"
android:background="@color/colorAccent"
/>
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/colorPrimary"
android:layout_alignBottom="@id/iv_1"
android:layout_alignEnd="@id/iv_1"
/>
</RelativeLayout>
效果如下:
约束布局 ConstraintLayout
约束布局ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了
解决布局嵌套过多的问题
,以灵活的方式定位和调整小部件
属性
使用方法
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/colorAccent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="20dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
效果如下:
不太确定控件的宽和高的时候,写作0dp
宽高比例
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/colorAccent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintDimensionRatio="w,1:2"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="20dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
效果如下:
在app:layout_constraintDimensionRatio="a,1:2"中,如果a为w,就是高宽比;如果a为h,就是宽高比
平分宽度
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/v1"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/colorAccent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/v2"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="20dp"
app:layout_constraintHorizontal_weight="1"
/>
<View
android:id="@+id/v2"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/colorPrimary"
app:layout_constraintTop_toTopOf="@id/v1"
app:layout_constraintBottom_toBottomOf="@id/v1"
app:layout_constraintStart_toEndOf="@id/v1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_weight="1"
android:layout_marginRight="20dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
效果如下:
心得体会
总算是把四个布局搞得比较清楚,也算会使用一些,但还是会有问题,继续克服