Android - 如何衡量包含在constraintLayout中的“任意大小”视图?

时间:2017-10-12 12:05:21

标签: android android-constraintlayout

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。希望这可以解决问题。

1 个答案:

答案 0 :(得分:1)

您可以使用ViewTreeObserver.OnPreDrawListener直接在向用户显示布局之前获取图片的边界。

  

<强> onPreDraw

     

boolean onPreDraw()

     

在即将绘制视图树时要调用的回调方法。此时,树中的所有视图都已经过测量并给出了一个框架。客户端可以使用它来调整其滚动边界,甚至可以在绘制之前请求新的布局。