【安卓,问题记录】ImageView 在布局顺序上位于 Button 上方,却出现图像内容被 Button 遮挡
记录一下项目中遇到的问题:
问题现象
在 FrameLayout 等布局中,后声明的 ImageView 本应覆盖在先声明的 Button 上方。
实际表现:ImageView 控件位置正确(布局层级在上),但图像内容却被 Button 遮挡。
布局文件中,控件明明位于按钮的上层,即在FrameLayout等布局中,控件卸载按钮的后面,但是控件的内容却被按钮覆盖了,如下:
<FrameLayoutandroid:layout_marginTop="@dimen/dp20"android:layout_marginEnd="@dimen/dp22"android:layout_marginStart="@dimen/dp22"android:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/btn_invite"android:text="立即邀请"android:visibility="gone"tools:visibility="visible"android:gravity="center"android:background="@drawable/shape_rect_gradient_red"android:textSize="@dimen/sp20"android:textColor="@color/white"android:layout_width="match_parent"android:layout_height="50dp"/><ImageViewandroid:id="@+id/iv_point"android:layout_gravity="end"android:layout_marginTop="@dimen/dp9"android:layout_marginEnd="@dimen/dp25"android:src="@mipmap/float_point"android:layout_width="54dp"android:layout_height="74dp"/>
</FrameLayout>
所造成的问题,图片被按钮覆盖了
原因
主题对控件样式的影响
1、现代 Material 主题会为 Button 自动添加 elevation,导致其 Z 轴层级高于无 elevation 的 ImageView,即使 ImageView 声明在后,也会被 Button 遮挡。
2、旧版主题(如 Theme.AppCompat 无阴影样式)中,Button 可能无默认 elevation,此时覆盖正常。
Z 轴层级优先级高于布局顺序
Android 中,控件的显示层级遵循:elevation(Z 轴高度)> 布局声明顺序。因此,即使 ImageView 声明在后,若 Button 的 elevation 更高,仍会显示在上方。
解决办法
1、给Button 换成TextView ,因为TextView 的elevation 默认为0;
2、提高 ImageView 的 elevation,给 ImageView 设置更高的 elevation(如 4dp),使其 Z 轴层级超过 Button(默认为2dp)。
本次问题解决使用了方法2,我给ImageView 设置了4dp的阴影结果如下: