Android常用布局使用技巧示例讲解

目录
  • 一、FrameLayout 帧布局
  • 二、ConstraintLayout 约束布局
    • 1、相对定位
    • 2、角度定位
    • 3、权重和0dp
    • 4、控件排成一排平均分布(默认)
    • 5、Group分组
    • 6、Barrier屏障

一、FrameLayout 帧布局

这种布局类似叠加的图片,没有任何的定位方式,当我们往里面添加组件的时候,会默认把他们放到容器的左上角。

上面的组件显示在底层,下面的组件显示在上层。

如下代码,视图1显示在最底层,视图3显示在最上层

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:gravity="bottom|end"
        android:text="视图1"
        android:background="@color/purple_200"
        android:textColor="@color/white"
        android:textSize="60sp"
        />
    <TextView
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:gravity="bottom|end"
        android:text="视图2"
        android:background="@color/teal_200"
        android:textColor="@color/white"
        android:textSize="60sp"
        />
    <TextView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:gravity="bottom|end"
        android:text="视图3"
        android:background="@color/teal_700"
        android:textColor="@color/white"
        android:textSize="60sp"
        />
</FrameLayout>

二、ConstraintLayout 约束布局

从 Android Studio 2.3 起,官方的模板默认使用 ConstraintLayout,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。

ConstraintLayout和RelativeLayout有点像,比RelativeLayout更灵活,性能更出色。可以按照比例约束控件位置和尺寸,能够更好地适配屏幕大小不同的机型。

1、相对定位

常用属性:

  • layout_constraintLeft_toLeftOf:左边和目标组件的左边对齐
  • layout_constraintLeft_toRightOf:左边和目标组件的右边对齐
  • layout_constraintRight_toLeftOf:右边和目标组件的左边对齐
  • layout_constraintRight_toRightOf:右边和目标组件的右边对齐
  • layout_constraintTop_toTopOf:上边和目标组件的上边对齐
  • layout_constraintTop_toBottomOf:上边和目标组件的下边对齐
  • layout_constraintBottom_toTopOf:下边和目标组件的上边对齐
  • layout_constraintBottom_toBottomOf:下边和目标组件的下边对齐
  • layout_constraintBaseline_toBaselineOf:文本基线对齐,如两个TextView的高度不一致,但是又希望他们文本对齐
  • layout_constraintStart_toStartOf:同layout_constraintLeft_toLeftOf
  • layout_constraintStart_toEndOf:同layout_constraintLeft_toRightOf
  • layout_constraintEnd_toStartOf:同layout_constraintRight_toLeftOf
  • layout_constraintEnd_toEndOf:同layout_constraintRight_toRightOf
  • layout_constraintHorizontal_bias:左右约束时的水平偏移量,可设置0-1的数值,默认0.5居中
  • layout_constraintVertical_bias:上下约束时的垂直偏移量,可设置0-1的数值,默认0.5居中
  • layout_constraintHorizontal_weight:水平权重值,可以是任意数值,在0dp时生效
  • layout_constraintVertical_weight:垂直权重,可以是任意数值,在0dp时生效
  • layout_constraintDimensionRatio:宽高比,当宽或高至少有一个尺寸被设置为0dp时可设置比例,如(1:2)

示例代码,计算器布局:

<?xml version="1.0" encoding="utf-8"?>
<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">
    <TextView
        android:id="@+id/c_view1"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_gravity="fill"
        android:gravity="end"
        android:layout_marginStart="5dp"
        android:layout_marginEnd="5dp"
        android:layout_marginTop="5dp"
        android:background="#FFCCCC"
        android:text="0"
        android:textSize="50sp" />
    <Button
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        app:layout_constraintTop_toBottomOf="@id/c_view1"
        app:layout_constraintStart_toStartOf="@id/c_view1"
        app:layout_constraintEnd_toStartOf="@id/btn_qk"
        android:layout_marginEnd="5dp"
        android:textSize="40sp"
        android:id="@+id/btn_ht"
        android:text="回退" />
    <Button
        android:id="@+id/btn_qk"
        android:layout_height="0dp"
        android:layout_width="0dp"
        app:layout_constraintEnd_toEndOf="@id/c_view1"
        app:layout_constraintStart_toEndOf="@id/btn_ht"
        app:layout_constraintTop_toBottomOf="@id/c_view1"
        app:layout_constraintBottom_toBottomOf="@id/btn_ht"
        android:textSize="40sp"
        android:text="清空" />
    <Button android:text="+"
        android:id="@+id/btn_jia"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_ht"
        app:layout_constraintStart_toStartOf="@id/btn_ht"
        app:layout_constraintEnd_toStartOf="@id/btn_01"
        />
    <Button android:text="1"
        android:id="@+id/btn_01"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_ht"
        app:layout_constraintStart_toEndOf="@id/btn_jia"
        app:layout_constraintEnd_toStartOf="@id/btn_02"
        />
    <Button android:text="2"
        android:id="@+id/btn_02"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_ht"
        app:layout_constraintStart_toEndOf="@id/btn_01"
        app:layout_constraintEnd_toStartOf="@id/btn_03"
        />
    <Button android:text="3"
        android:id="@+id/btn_03"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_ht"
        app:layout_constraintStart_toEndOf="@id/btn_02"
        app:layout_constraintEnd_toEndOf="@id/btn_qk"
        />
    <Button android:text="-"
        android:id="@+id/btn_jian"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jia"
        app:layout_constraintStart_toStartOf="@id/btn_ht"
        app:layout_constraintEnd_toStartOf="@id/btn_04"
        />
    <Button android:text="4"
        android:id="@+id/btn_04"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jia"
        app:layout_constraintEnd_toStartOf="@id/btn_05"
        app:layout_constraintStart_toEndOf="@id/btn_jian"
        />
    <Button android:text="5"
        android:id="@+id/btn_05"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jia"
        app:layout_constraintEnd_toStartOf="@id/btn_06"
        app:layout_constraintStart_toEndOf="@id/btn_04"
        />
    <Button android:text="6"
        android:id="@+id/btn_06"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jia"
        app:layout_constraintStart_toEndOf="@id/btn_05"
        app:layout_constraintEnd_toEndOf="@id/btn_qk"
        />
    <Button android:text="*"
        android:id="@+id/btn_xin"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jian"
        app:layout_constraintStart_toStartOf="@id/btn_ht"
        app:layout_constraintEnd_toStartOf="@id/btn_07"
        />
    <Button android:text="7"
        android:id="@+id/btn_07"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jian"
        app:layout_constraintEnd_toStartOf="@id/btn_08"
        app:layout_constraintStart_toEndOf="@id/btn_xin"
        />
    <Button android:text="8"
        android:id="@+id/btn_08"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jian"
        app:layout_constraintEnd_toStartOf="@id/btn_09"
        app:layout_constraintStart_toEndOf="@id/btn_07"
        />
    <Button android:text="9"
        android:id="@+id/btn_09"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_jian"
        app:layout_constraintStart_toEndOf="@id/btn_08"
        app:layout_constraintEnd_toEndOf="@id/btn_qk"
        />
    <Button android:text="/"
        android:id="@+id/btn_chu"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_xin"
        app:layout_constraintStart_toStartOf="@id/btn_ht"
        app:layout_constraintEnd_toStartOf="@id/btn_dian"
        />
    <Button android:text="."
        android:id="@+id/btn_dian"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_xin"
        app:layout_constraintEnd_toStartOf="@id/btn_00"
        app:layout_constraintStart_toEndOf="@id/btn_chu"
        />
    <Button android:text="0"
        android:id="@+id/btn_00"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_marginEnd="5dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_xin"
        app:layout_constraintEnd_toStartOf="@id/btn_deng"
        app:layout_constraintStart_toEndOf="@id/btn_dian"
        />
    <Button android:text="="
        android:id="@+id/btn_deng"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintTop_toBottomOf="@id/btn_xin"
        app:layout_constraintStart_toEndOf="@id/btn_00"
        app:layout_constraintEnd_toEndOf="@id/btn_qk"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

2、角度定位

常用属性:

  • layout_constraintCircle:角度定位参照目标组件
  • layout_constraintCircleAngle:偏移角度,参照组件垂直方向往右边转动角度
  • layout_constraintCircleRadius:距离

<?xml version="1.0" encoding="utf-8"?>
<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">
    <!-- 按钮1 屏幕居中 -->
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="94dp"
        android:text="按钮1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
    <!-- 按钮2 相对按钮1旋转120度,且距离按钮1中心点120dp -->
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="按钮2"
        app:layout_constraintCircle="@id/button"
        app:layout_constraintCircleAngle="120"
        app:layout_constraintCircleRadius="120dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

3、权重和0dp

  • 如果layout_width设置为0dp,那么控件就会水平铺开撑满所有空间
  • 如果layout_height设置为0dp,那么控件就会垂直铺开撑满所有空间
  • layout_constraintHorizontal_weight:设置权重值,可以是任意数值

4、控件排成一排平均分布(默认)

一条链的第一个控件是这条链的链头,我们可以在链头中设置layout_constraintHorizontal_chainStyle来改变整条链的样式。chains提供了3种样式,分别是:

  • CHAIN_SPREAD:展开元素平均分布 (默认)
  • CHAIN_SPREAD_INSIDE:展开元素,但链的两端贴近parent
  • CHAIN_PACKED:链的元素将被打包在一起

<?xml version="1.0" encoding="utf-8"?>
<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">
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/button2" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮2"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/button"
        app:layout_constraintRight_toLeftOf="@id/button3"  />
    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮3"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@id/button2"
        app:layout_constraintRight_toRightOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

5、Group分组

Group可以把多个控件归为一组,方便隐藏或显示一组控件

    <androidx.constraintlayout.widget.Group
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:constraint_referenced_ids="btn_deng,btn_00,btn_dian"/>

6、Barrier屏障

Barrier只是用来辅助布局,不会显示在页面上,其他组件可以和Barrier做约束。

  • constraint_referenced_ids:参考的组件id列表,多个用逗号(,)隔开
  • barrierDirection:屏障位于参考组件的位置,可选值(left、right、top、bottom、start、end)
    <androidx.constraintlayout.widget.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="right"
        app:constraint_referenced_ids="btn_01,btn_02"
        />

到此这篇关于Android常用布局使用技巧示例讲解的文章就介绍到这了,更多相关Android常用布局内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android布局中gravity与layout_gravity属性说明

    目录 gravity与layout_gravity属性 1.gravity 2.layout_gravity属性 3.相对布局中的layout_center属性 总结 gravity与layout_gravity属性 在android布局中,我们经常会用到“重心”-gravity这个属性. 但是gravity有不同的类型: gravity layout_gravity 相对布局中的layout_center等属性 今天我们就来具体说说. 1.gravity gravity属性是对控件自身内容对自

  • Android studio六大基本布局详解

    目录 Android中常用的布局方式有以下几种: (一)线性布局LinearLayout (二)相对布局RelativeLayout (三)表格布局TableLayout (四)帧布局FrameLayout (五)绝对布局AbsoluteLayout (六)网格布局GridLayout Android中常用的布局方式有以下几种: 线性布局LinearLayout 相对布局RelativeLayout 表格布局TableLayout 层布局FrameLayout 绝对布局AbsoluteLayou

  • Android自定义ViewGroup实现九宫格布局

    目录 前言 一.九宫格的测量 二.九宫格的布局 三.单图片与四宫格的单独处理 四.自定义布局的抽取 4.1 先布局再隐藏的思路 4.2 数据适配器的思路 前言 在之前的文章我们复习了 ViewGroup 的测量与布局,那么我们这一篇效果就可以在之前的基础上实现一个灵活的九宫格布局. 那么一个九宫格的 ViewGroup 如何定义,我们分解为如下的几个步骤来实现: 先计算与测量九宫格内部的子View的宽度与高度. 再计算整体九宫格的宽度和高度. 进行子View九宫格的布局. 对单独的图片和四宫格的

  • 分享五种Android常用布局方式

    现在Android非常疯狂,所以网上关于Android学习的资料如雨后春笋般冒起来,像这些基础的东西更是多如牛毛,我会把用过的东西碰到的困难和怎么解决的记录下来,一来可以供自己复习万一以后又碰到类似的问题就可以直接拿来看下.二来可以给初学者一点小小的帮助. Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布 局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相

  • Android常用布局(FrameLayout、LinearLayout、RelativeLayout)详解

    很多开发者一听说Android终端的屏幕尺寸五花八门,屏幕分辨率千奇百怪,就觉得Android开发在屏幕适配方面是必定是一件头疼的事情.因为在Android问世之前,广大开发者知道的UI解决方案大致分为两类: 1.在Web开发中的CSS,一层一层的去层叠样式. 2.在iOS开发中去计算每一个UIView的尺寸. 上面两种方案,无论哪种方案面对碎片化严重的Android终端,那都是一场噩梦.好在Android提供了另一套解决方案来应对严重的终端碎片化,这就是布局和9-patch. 这里想来说说布局

  • Android 组件Gallery和GridView示例讲解

    Android Gallery和GridView组件: Gallery 画廊 Gallery是一个内部元素可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件. 我们还是直接看看例子的运行效果. 下面上代码,相关解释都放在代码里了. 1.建立一个新项目 HelloGallery 2.拷贝wallpaper_0.jpg-wallpaper_9.jpg 10个图片文件到res/drawable目录 3.res/layout/main.xml文件的内容如下: <?xml version=&quo

  • android检测网络连接状态示例讲解

    Android连接首先,要判断网络状态,需要有相应的权限,下面为权限代码(AndroidManifest.xml): 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/> 然后,检测网络状态是否可用 复制代码

  • Android APK反编译技巧深入讲解

    导言: 在我们安卓开发当中,我们不仅需要掌握基础的开发技能,也需要掌握软件的安全技能,这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件,同时也可以让自己的核心技术不会被别人所盗取.首先我们应当了解的是,对于反编译我们一共需要三个工具,它们分别是:APKTool,dex2jar,和jd-gui.APKTool:用于解析apk的res文件以及AndroidManifest.xml文件dex2jar:用于把apk解压后生成的classes.dex文件解析为后缀为jar的文件,与下面的jd-

  • 基于Android代码实现常用布局

    关于 android 常用布局,利用 XML 文件实现已经有很多的实例了.但如何利用代码实现呢?当然利用代码实现没有太大的必要,也是不提倡的,但我觉得利用代码实现这些布局,可以更好的了解 SDK API ,所以在此也整理一些,和大家分享一下. 首先看一下,布局所对应的类的 API 继承图: android常用布局的代码实现所有的布局都会对应相关的类,这些类都是继承自 android.view.ViewGroup 类的.而 LinearLayout,RelativeLayout 都是在 andro

  • Android开发组件flutter的20个常用技巧示例总结

    目录 1.map遍历快速实现边距,文字自适应改变大小 2.使用SafeArea 添加边距 3.布局思路 4.获取当前屏幕的大小 5.文本溢出显示省略号 6.一个圆角带搜索icon的搜索框案例 7.修改按钮的背景色 8.tab切换实例 9.点击事件组件点击空白区域不触发点击 10.使用主题色 11.往安卓模拟器中传图片 12.控制text的最大行数显示影藏文字 13.去掉默认的抽屉图标 14.图片占满屏 15.倒计时 16.固定底部 17.添加阴影 18.隐藏键盘 19.获取父级组件大小 20.点

  • android监听View加载完成的示例讲解

    最近项目中需要实现一个GridView显示6*5=30项,并铺满整个界面,界面中还有自定义ActionBar等其他控件,所以需要获取剩下屏幕的高度.通过百度得知View有一个监听函数,亲测使用有效,特此记录,方便日后查阅. gv_test.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayo

  • Android中ListView Item布局优化技巧

    本文实例讲述了Android中ListView Item布局优化技巧.分享给大家供大家参考,具体如下: 之前一直都不知道ListView有多种布局的优化方法,只能通过隐藏来实现,自己也知道效率肯定是很低的,但是也不知道有什么方法,这些天又查了一些资料,然后知道 其实google早就帮我们想好了优化方案了. 假设你的ListView Item有三种布局样式的可能:就比如很简单的显示一行字,要靠左,居中,靠右. 这时我们就可以在BaseAdapter里面重写两个方法: private static

  • Android fragment实现按钮点击事件的示例讲解

    fragment无法直接进行点击事件,需要放到oncreatActivity中 代码如下: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_first, null); return view; } 点击事件代码: @Override

随机推荐