如何解决ConstraintLayout - ViewGroup 的 onMeasure()
我创建了扩展 View
的自定义 ConstraintLayout
。我想实现 onMeasure() 是因为我注意到在具有不同尺寸和/或填充/边距的不同组件上进行尺寸定制时存在问题。
这是我的视图布局:
<?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"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@android:color/transparent">
<androidx.appcompat.widget.AppCompatimageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:button="@drawable/drawable_state"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:lottie_rawRes="@raw/animation_json"
app:lottie_speed="2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:lottie_autoplay="false"
app:lottie_loop="false"/>
</androidx.constraintlayout.widget.ConstraintLayout>
我想出了这样的东西:
override fun onMeasure(widthMeasureSpec: Int,heightMeasureSpec: Int) {
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
val width = when(widthMode) {
MeasureSpec.EXACTLY -> widthSize
MeasureSpec.AT_MOST -> min(STANDARD_WIDTH,widthSize)
else -> STANDARD_WIDTH
}
val height = when(heightMode) {
MeasureSpec.EXACTLY -> heightSize
MeasureSpec.AT_MOST -> min(STANDARD_HEIGHT,heightSize)
else -> STANDARD_HEIGHT
}
setMeasuredDimension(width,height);
}
但事实证明,因为它是带孩子的容器,所以我也必须照顾它。所以我在这里搜索并找到了包含子视图的实现:
override fun onMeasure(widthMeasureSpec: Int,heightMeasureSpec: Int) {
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val widthSize = MeasureSpec.makeMeasureSpec(widthMeasureSpec,MeasureSpec.EXACTLY)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
val heightSize = MeasureSpec.makeMeasureSpec(heightMeasureSpec,MeasureSpec.EXACTLY)
for (index in 0 until childCount) {
val child: View = getChildAt(index)
child.measure(widthSize,heightSize)
}
val width = when (widthMode) {
MeasureSpec.EXACTLY -> widthSize
MeasureSpec.AT_MOST -> min(STANDARD_WIDTH,widthSize)
else -> STANDARD_WIDTH
}
val height = when (heightMode) {
MeasureSpec.EXACTLY -> heightSize
MeasureSpec.AT_MOST -> min(STANDARD_HEIGHT,height)
}
这似乎没有任何作用,但我的视图仍然不可见,因此对于它们来说,大小可能仍然为 0。
我不能说我理解这一点,而且我对布局感觉不太好。 onMeasure() 对我来说有点新,我从来没有实施过它。
如果有人能告诉我我做错了什么,我将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。