安卓布局实战头部栏

实现一个很多APP都有的头部栏 三个模块,左中右

1. 使用线性布局处理

思路:

  • 首先使用线性布局处理外部定好宽高match_parent,44dp
  • 由于通用标题栏是后端数据,那么长度不定,需要做超长省略,那就先定好前后两个元素的长宽,将中间元素宽度自适应layout_width="0dp",layout_weight="1"
  • 然后做个超长省略android:maxLines="1" android:ellipsize="end"
ini 复制代码
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="44dp"
    tools:ignore="MissingConstraints">

    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@drawable/icon"
        android:layout_gravity="center"
        />

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="我的会员购买"
        android:maxLines="1"
        android:ellipsize="end"
        android:layout_gravity="center"
        android:textColor="#fff"
        />

    <TextView
        android:layout_marginLeft="40dp"
        android:layout_marginRight="20dp"
        android:layout_width="40dp"
        android:layout_height="20dp"
        android:text="账户"
        android:gravity="center"
        android:textColor="#ffffffff"
        android:layout_gravity="center"
        />
</LinearLayout>

2. 使用约束布局

思路:

  • 首先将前后两个使用约束布局约束靠边
  • 将第二个元素相当于第一个元素约束
  • 第二个元素layout_constraintWidth_max设置最大宽度
  • 做超长省略
  • 元素内部使用gravity:center
ini 复制代码
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="44dp">
    <ImageView
        android:id="@+id/reset"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@drawable/icon"
        android:gravity="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        />

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="我的会员购买"
        android:maxLines="1"
        android:ellipsize="end"
        android:textColor="#fff"
        app:layout_constraintWidth_max="300dp"
        app:layout_constraintLeft_toRightOf="@+id/reset"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />

    <TextView
        android:layout_marginLeft="40dp"
        android:layout_marginRight="20dp"
        android:layout_width="40dp"
        android:layout_height="20dp"
        android:text="账户"
        android:gravity="center"
        android:textColor="#ffffffff"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

3. 使用相对布局

  • 相对布局注意使用layout_centerVertical用于居中,使用gravitylayout_gravity是没法做居中逻辑的, 这里提一句gravitylayout_gravity的区别,layout_gravity是我相对于父布局得位置,gravity是子布局相对于我的位置。
ini 复制代码
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="44dp"
   >

    <ImageView
        android:id="@+id/reset"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignParentLeft="true"
        android:src="@drawable/icon"
        android:layout_centerVertical="true"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/reset"
        android:maxWidth="300dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="我的会员购买"
        android:textColor="#fff"
        android:layout_centerVertical="true"
        />

    <TextView
        android:layout_width="40dp"
        android:layout_height="20dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="20dp"
        android:text="账户"
        android:textColor="#fff"
        android:layout_centerVertical="true"
        />
</RelativeLayout>

4. 使用Frame布局

主要是利用layout_gravity的功能处理

ini 复制代码
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="44dp"
   >

    <ImageView
        android:id="@+id/reset"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@drawable/icon"
        android:layout_gravity="left|center_vertical"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxWidth="300dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="我的会员购买"
        android:textColor="#fff"
        android:layout_gravity="center"
        />

    <TextView
        android:layout_width="40dp"
        android:layout_height="20dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="20dp"
        android:text="账户"
        android:textColor="#fff"
        android:layout_gravity="end|center_vertical"
        />
</FrameLayout>

5.总结

通过以上总结以下做垂直居中的布局来说 思路一父布局固定高度,子布局match_parent就采用gravity,子布局采用wrap_content,就采用layout_gravity

相关推荐
y先森11 分钟前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy11 分钟前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu108301891114 分钟前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿1 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇3 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐3 小时前
前端图像处理(一)
前端