测量 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());
将 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());