测量 GridView 行中的最终 ImageView 宽度

Measure final ImageView width in GridView row

将 ImageView 添加到 GridView 项(适配器)时,我想知道 ImageView 在屏幕上呈现时的最终宽度,以便我可以调整 TextView 以适应 ImageView 的确切大小。但是,当将 ImageView 添加为 GridView 项目时,根据 GridView 的可用宽度,ImageView 将获得 resized/scaled 并使用额外的填充/边距定位。

示例:

假定文本仅覆盖 ImageView 而不会跨越容器的整个宽度。

上图渲染如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

<net.ninefigures.caspertv.widget.SizeAwareImageView
    android:id="@+id/thumbnail"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:src="@drawable/mqdefault"/>

<net.ninefigures.caspertv.widget.SourceSansProTextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:maxLines="2"
    android:layout_alignBottom="@id/preview"
    android:text="Lorum Ipsum Dolor Sit Amit"/>

</RelativeLayout>

尝试使用以下方法测量 Grid Item 的 getView 中的 ImageView 宽度:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ...

    final TextView title = (TextView) convertView.findViewById(R.id.title);
    final ImageView thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);

    ViewTreeObserver viewTreeObserver = thumbnail.getViewTreeObserver();
        if(viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    ViewTreeObserver viewTreeObserver = thumbnail.getViewTreeObserver();

                    if (viewTreeObserver.isAlive()) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            viewTreeObserver.removeOnGlobalLayoutListener(this);
                        } else {
                            viewTreeObserver.removeGlobalOnLayoutListener(this);
                        }
                    }

                    Log.d(TAG, String.format("MeasuredHeight:  %d", thumbnail.getHeight()));
                    Log.d(TAG, String.format("MeasuredWidth:  %d", thumbnail.getWidth()));
                }
            });
        }

然而,这总是returns 0;

关于如何测量 ImageView 的最终宽度有什么想法吗?

在里面试试

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
}

它将在您的视图呈现后调用。

显然,诀窍是在渲染之前显式测量 ImageView 的 width/height。

thumbnail.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
title.setWidth(thumbnail.getMeasuredWidth());