ConstraintLayout百分比Guideline在wrap_content下失效,如何实现30%屏高的ImageView?
解决AppCompatImageView占屏幕30%高度的问题
我来帮你搞定这个布局问题!先说说你之前代码的问题所在:
- 当把
ConstraintLayout的android:layout_height设为wrap_content时,你用的Guideline的百分比是基于父布局(也就是这个ConstraintLayout)的高度来计算的,但此时父布局的高度还没确定(因为AppCompatImageView的高度依赖Guideline),这就形成了循环依赖,导致ImageView高度为0,自然看不到内容。 - 当设为
match_parent时,ConstraintLayout会占满整个RecyclerView的高度(也就是屏幕高度),而你把Guideline设为0.25(即25%屏幕高度),所以ImageView只占屏幕的25%,剩下的75%就成了空白区域,这就是底部大量空白的原因。
要实现AppCompatImageView高度为屏幕30%的需求,并且让RecyclerView的item刚好包裹这个ImageView,不需要多余空白,你可以用下面两种方法:
方法一:直接使用高度百分比(推荐,更简洁)
去掉Guideline,直接给AppCompatImageView设置高度百分比属性,这样它的高度会自动基于父容器(RecyclerView)的高度(也就是屏幕高度)的30%来计算,同时ConstraintLayout用wrap_content来包裹它:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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="wrap_content"> <android.support.v7.widget.AppCompatImageView android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintHeight_percent="0.3" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/pic" /> </android.support.constraint.ConstraintLayout>
方法二:使用Guideline(如果坚持用这种方式)
如果一定要保留Guideline,需要把ConstraintLayout的高度设为match_parent,但同时给它添加app:layout_constraintHeight_default="wrap",这样它会根据子view的高度来自适应,而不是强制占满屏幕:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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" app:layout_constraintHeight_default="wrap"> <android.support.v7.widget.AppCompatImageView android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/guideline1" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/pic" /> <android.support.constraint.Guideline android:id="@+id/guideline1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3"/> </android.support.constraint.ConstraintLayout>
两种方法都能实现你要的效果,方法一更简单直接。另外建议你如果项目允许的话,升级到AndroidX库,替换掉旧的support库,这样能获得更好的兼容性和新特性。
内容的提问来源于stack exchange,提问作者raza Amini
相关产品推荐
相关产品推荐

