Android开发:如何将ProgressBar置于View上层?
如何让ProgressBar显示在View上层(解决遮挡问题)
我来帮你搞定这个ProgressBar被下层View挡住的问题,下面是几个实用的解决方案:
方案1:调整XML中控件的声明顺序
在ConstraintLayout(以及大多数Android布局容器)里,后声明的控件会默认显示在更上层。你现在的ProgressBar写在View2前面,所以被View2盖住了。只要把ProgressBar的代码移到View2后面就行:
<?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" android:padding="10dp" tools:context=".MainActivity"> <View android:id="@+id/view2" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/rounded_rec" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent="0.6" app:layout_constraintStart_toStartOf="parent" /> <!-- 把ProgressBar移到View2之后,层级自动提升 --> <ProgressBar android:id="@+id/progressBar" android:layout_width="0dp" android:layout_height="0dp" android:indeterminateOnly="false" android:progressDrawable="@drawable/percentage_circle" app:layout_constraintWidth_percent="0.6" app:layout_constraintHeight_percent="0.36" app:layout_constraintStart_toStartOf="@+id/view2" app:layout_constraintTop_toTopOf="@+id/view2" /> <View android:id="@+id/view3" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/rounded_rec" app:layout_constraintHeight_percent="0.4" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintWidth_percent="0.6" /> <View android:id="@+id/view4" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/rounded_rec" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent="0.4" app:layout_constraintTop_toTopOf="parent" app:layout_constraintWidth_percent="0.4" /> </androidx.constraintlayout.widget.ConstraintLayout>
方案2:使用android:elevation属性设置Z轴层级
Android的View支持Z轴层级,通过elevation属性可以设置控件的“高度”,值越大的控件越靠上。给你的ProgressBar添加一个比View2更高的elevation值就行:
<ProgressBar android:id="@+id/progressBar" android:layout_width="0dp" android:layout_height="0dp" android:indeterminateOnly="false" android:progressDrawable="@drawable/percentage_circle" android:elevation="8dp" <!-- 添加这个属性,值比遮挡它的View大即可 --> app:layout_constraintWidth_percent="0.6" app:layout_constraintHeight_percent="0.36" app:layout_constraintStart_toStartOf="@+id/view2" app:layout_constraintTop_toTopOf="@+id/view2" />
如果View2也设置了elevation,只要确保ProgressBar的elevation值比它大就可以。
方案3:使用translationZ属性动态调整层级
translationZ和elevation类似,不过它是用来动态调整控件的Z轴偏移的,适合在代码里动态修改层级,当然也可以在XML里设置:
<ProgressBar android:id="@+id/progressBar" android:layout_width="0dp" android:layout_height="0dp" android:indeterminateOnly="false" android:progressDrawable="@drawable/percentage_circle" android:translationZ="8dp" <!-- 同样设置比遮挡控件大的值 --> app:layout_constraintWidth_percent="0.6" app:layout_constraintHeight_percent="0.36" app:layout_constraintStart_toStartOf="@+id/view2" app:layout_constraintTop_toTopOf="@+id/view2" />
这些方案是否适用于EditText、TextView等其他控件?
当然适用!EditText、TextView都是View的子类,Android所有控件的层级控制逻辑都是一致的:
- 调整XML声明顺序对所有View都有效
elevation和translationZ属性也能直接用在这些控件上,用来控制它们的显示层级,解决互相遮挡的问题
内容的提问来源于stack exchange,提问作者Phat Tran
相关产品推荐
相关产品推荐

