ConstraintLayout需要两次传递才能为任意大小的视图测量自身(维度为0dp的视图)。所以我有一个基于比率的视图,我想测量用户看到视图之前的大小。我这样做是一个适用于recyclerview的适配器,如果这很重要。到目前为止我所尝试的是以下内容:
iv.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
width = iv.getMeasuredWidth();
height = iv.getMeasuredHeight();
这是布局:
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="11dp"
android:layout_marginRight="11dp"
android:layout_marginTop="0dp"
app:layout_constraintDimensionRatio="H,3:2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</android.support.constraint.ConstraintLayout>
但是这总是给我1宽度和1高度。我怎样才能得到实际的测量值?
我需要测量的视图的原因是构建一个url。这是我需要的一个示例网址:
mywebsiteAtImgix.com/img/books/20170316171929_6b1c02a5.jpg?auto=compress&dpr=1&fit=clip&ixlib=java-1.1.1&q=75&w=1&h=1
更多信息: 我正在使用一家名为imgix的公司,他们为我扩展了我的所有图像。非常快,它们缓存等,因此它对网络图像很有用 无论如何,请注意查询参数的宽度称为“w”,高度为“h”。现在他们以1为单位但是对于非约束布局的图像视图,当我测量它时,我得到的尺寸正常,从imgix返回的图像是一个很好的尺寸。如果我使用1和1的尺寸,它会带回原始图像,这个图像非常大(2mb到5mb +)。我需要从constraintLayout获取维度,以便我可以正确构建URL。希望这可以解决问题。
答案 0 :(得分:1)
您可以使用ViewTreeObserver.OnPreDrawListener
直接在向用户显示布局之前获取图片的边界。
<强> onPreDraw 强>
boolean onPreDraw()
在即将绘制视图树时要调用的回调方法。此时,树中的所有视图都已经过测量并给出了一个框架。客户端可以使用它来调整其滚动边界,甚至可以在绘制之前请求新的布局。