如何获得 android.widget 的宽度和高度?

╔══════════════════════════════════════════════╗   ^
║ ImageView    ╔══════════════╗                ║   |
║              ║              ║                ║   |
║              ║ Actual image ║                ║   |
║              ║              ║                ║   |60px height of ImageView
║              ║              ║                ║   |
║              ║              ║                ║   |
║              ╚══════════════╝                ║   |
╚══════════════════════════════════════════════╝
<------------------------------------------------>
90px width of ImageView

我有一个图像视图与一些默认的高度和宽度,图像存储在数据库,我想缩放图像根据 Imageview 高度宽度。因为我不希望它给默认值,因为每当我改变它的高度和宽度,我也必须改变它的代码。

我试图获取 ImageView 的高度和宽度,但在这两种情况下都返回0。

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

即使它有默认的高度和宽度,它也返回0

158792 次浏览

我的朋友,通过这个u并没有得到存储在db中的图像的高度。但是你得到了视图高度。为了获得图像的高度,你必须从db,s图像创建位图。然后你可以获取imageview的高度和宽度

我对这个问题的回答可能会帮助你:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
iv.getViewTreeObserver().removeOnPreDrawListener(this);
finalHeight = iv.getMeasuredHeight();
finalWidth = iv.getMeasuredWidth();
tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
return true;
}
});

然后你可以在onPreDraw()方法中添加你的图像缩放工作。

我认为你可以让Android操作系统为你解决这个问题。将ImageView上的缩放类型设置为fitXY,它所显示的图像将调整为适合当前视图的大小。

<ImageView
android:layout_width="90px"
android:layout_height="60px"
android:scaleType="fitXY" />

ImageView的维度为0的原因是因为当你查询它们时,视图还没有执行布局和测量步骤。你只是告诉视图它将如何在布局中“表现”,但它仍然没有计算出将每个视图放在哪里。

你如何决定图像视图的大小?难道不能简单地使用本地实现的伸缩选项之一吗?

我只是设置了这个属性,现在Android OS会处理所有事情。

android: adjustViewBounds = " true "

在你的layout.xml中使用这个,你已经种植了你的ImageView:D

如果你已经创建了动态多个图像,那么试试这个:

// 初始化你的图像数组

private ImageView myImages[] = new ImageView[your_array_length];

// 创建编程和添加到父视图

 for (int i = 0; i < your_array_length; i++) {
myImages[i] = new ImageView(this);
myImages[i].setId(i + 1);
myImages[i].setBackgroundResource(your_array[i]);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
frontWidth[i], frontHeight[i]);
((MarginLayoutParams) params).setMargins(frontX_axis[i],
frontY_axis[i], 0, 0);
myImages[i].setAdjustViewBounds(true);
myImages[i].setLayoutParams(params);


if (getIntent() != null && i != your_array,length) {
final int j = i;
myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
finalHeight = myImages[j].getMeasuredHeight();
finalWidth = myImages[j].getMeasuredWidth();
your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
return true;
}
});
}
your_parent_layout.addView(myImages[i], params);
}

//就是这样。快乐的编码。

最简单的方法是在活动的onWindowFocusChanged方法中获取ImageView的宽度和高度

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


height = mImageView.getHeight();
width = mImageView.getWidth();


}

Post到UI线程为我工作。

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);


iv.post(new Runnable() {
@Override
public void run() {
int width = iv.getMeasuredWidth();
int height = iv.getMeasuredHeight();


}
});

我可以通过它的drawable获得图像的宽度和高度;

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();

您的XML文件:

 <ImageView android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image"
android:scaleType="fitXY"
android:adjustViewBounds="true"/>

你的Java文件:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
int width = imageView.getDrawable().getIntrinsicWidth();
int   height = imageView.getDrawable().getIntrinsicHeight();