如何在Android 5中将ImageView置于Button前面?

16
在Lolipop版本之前的Android系统中,以下代码可行,可以将一张图片放在按钮的前面。但在Android 5中,ImageView会被放在按钮的后面。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
    android:id="@+id/button"
    android:layout_width="210sp"
    android:layout_height="210sp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@drawable/round_button"
    android:drawablePadding="10dip"
    android:gravity="center_vertical|center_horizontal" />


<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:contentDescription="@string/torch"
    android:src="?attr/imageview" />

 </RelativeLayout>

这些是否在RelativeLayout中? - CommonsWare
@CommonsWare 是的,它们在里面。 - Mehdi Fanai
2个回答

41
问题似乎出现在Android 5.0中的“elevation”属性。显然,RelativeLayout的Z轴排序与“elevation”相关联。如果两个小部件具有相同的“elevation”,则RelativeLayout将确定Z轴顺序--例如,如果您将布局切换为两个按钮小部件,则可以看到这一点。但是,如果一个小部件(Button)具有elevation,而另一个小部件(ImageView)没有,则elevation将优先考虑。
您可以通过“android:stateListAnimator = @ null”或定义自己的自定义动画来删除“Button”的“elevation”。或者,您可以为您的“ImageView”添加一些“elevation”,使其比“Button”更高地位于Z轴上。

只是为了澄清,有些小部件具有预设的高度值,这会覆盖默认的排序吗? - LambergaR
1
@LambergaR:我更倾向于这样表述:一些小部件具有影响它们高度的方面,例如默认为Button设置的stateListAnimator - CommonsWare
"android:stateListAnimator="@null" 这需要API级别21及更高版本,但我的minSdkVersion是19。" - Ajay S
最终我可以将视图放在按钮前面。 - Jamil
最后,设置android:stateListAnimator="@null"是唯一在28 9.0上有效的解决方案。 - Dmitriy Pavlukhin

3

按钮的高度和translationZ值在框架中定义如下:

<!-- Elevation when button is pressed -->
<dimen name="button_elevation_material">1dp</dimen>
<!-- Z translation to apply when button is pressed -->
<dimen name="button_pressed_z_material">2dp</dimen>

源代码

就像CommonsWare所解释的那样,将ImageView的translationZ值设置高于Button值将会得到预期的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接