Android:如何实现ImageView垂直中心对齐LinearLayout顶部的半覆盖布局
实现ImageView垂直中心与LinearLayout顶部对齐的XML布局方案
需求:让黑色圆形ImageView的垂直中心恰好与红色LinearLayout的顶部对齐,使圆形一半位于红布局上方,一半嵌入其中,要求用XML实现最简单的方案。
布局效果示意图:
现有布局代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/red" android:layout_alignParentBottom="true" android:layout_above="@+id/red_block"> SOME OTHER VIEWS INSIDE </LinearLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/some_circle" android: CENTER_ON_TOP_OF_RED_BLOCK??? /> </RelativeLayout>
解决方案
可以完全通过XML实现,提供两种常用方案:
方案一:基于RelativeLayout(需固定ImageView尺寸)
先修正原有LinearLayout的错误属性并设置唯一ID,再给ImageView添加负margin实现偏移:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/red_block" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/red" android:layout_alignParentBottom="true"> <!-- 内部视图 --> </LinearLayout> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/some_circle" android:layout_centerHorizontal="true" android:layout_alignTop="@id/red_block" android:layout_marginTop="-50dp"/> </RelativeLayout>
- 原理:将ImageView顶部与LinearLayout顶部对齐,再向上偏移自身高度的一半(示例中宽高100dp,故marginTop设为-50dp),刚好让圆形中心与LinearLayout顶部重合。
方案二:基于ConstraintLayout(灵活适配任意尺寸)
若想适配ImageView的任意尺寸,改用ConstraintLayout更便捷,无需固定数值:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/red_block" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/red" app:layout_constraintBottom_toBottomOf="parent"> <!-- 内部视图 --> </LinearLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/some_circle" android:translationY="-50%" app:layout_constraintTop_toTopOf="@id/red_block" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> </RelativeLayout>
- 原理:
android:translationY="-50%"会让ImageView向上偏移自身高度的50%,无论ImageView实际尺寸如何,都能保证垂直中心与LinearLayout顶部对齐。
内容的提问来源于stack exchange,提问作者BBNN
相关产品推荐
相关产品推荐

