将ImageView添加到GridView项目(适配器)时,我想知道ImageView在屏幕上呈现时的最终宽度,因此我可以将TextView调整为ImageView的确切大小。但是,当将ImageView作为GridView项添加时,基于GridView的可用宽度,ImageView将被调整大小/缩放并使用额外的填充/边距进行定位。
示例:
假设文本仅覆盖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>
尝试使用以下内容测量网格项的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()));
}
});
}
然而,这总是返回0;
有关如何测量ImageView最终宽度的任何想法?
答案 0 :(得分:0)
尝试内部
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
}
将在渲染视图后调用它。
答案 1 :(得分:0)
显然,技巧是在渲染之前显式测量ImageView的宽度/高度。
thumbnail.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
title.setWidth(thumbnail.getMeasuredWidth());