如何获取imageview的宽度和高度

时间:2013-05-05 11:55:57

标签: android

我有这个XML代码:

<LinearLayout
 android:id="@+id/linearLayoutInner"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@layout/gallery_image_background"
/>

然后这段代码:

LinearLayout linearLayoutInner = (LinearLayout) findViewById(R.id.linearLayoutInner);
ImageView imageView = new ImageView(thisActivityContext);
imageView.setImageResource(R.drawable.example);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(lp);
linearLayoutInner.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
linearLayoutInner.addView(imageView);

然后我调用一个自己的函数,用于缩放位图图像,直到其中一个边到达边缘(即如果原始的bitmat是高的两倍,它会将比例保持在imageview中,这是显然不支持任何比例尺设置):

SharedCode.sharedUtilScaleImage(imageView);

这就是问题所在。该函数需要知道包含可绘制位图的视图的大小。如果imageView行为正确,则应使用 MATCH_PARENT ,因此给出 linearLayoutInner 的宽度/高度。但是,以下代码返回零:

int heightParent = max(imageView.getLayoutParams().height, imageView.getHeight());      
int widthParent = max(imageView.getLayoutParams().width, imageView.getWidth());

我该如何解决这个问题?为什么我返回0而不是正确的高度/宽度?​​

3 个答案:

答案 0 :(得分:3)

在调用View的onMeasure()之前,你可能过早地调用了代码。在此之前,它的大小是未知的。

final ImageView iv....
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //Measure
        iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});

答案 1 :(得分:3)

final ImageView imageView = (ImageView )findViewById(R.id.image_test);
    ViewTreeObserver vto = imageView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            imageView .getViewTreeObserver().removeGlobalOnLayoutListener(this);
            imageView.getHeight(); // This will return actual height.
            imageView.getWidth(); // This will return actual width.
        }
    });    

答案 2 :(得分:1)

好像你可能会从onCreate()打来的电话。你需要等待附加的活动窗口,然后在getWidth()上拨打getHeight()imageView。您可以尝试从{{1}拨打getWidth()getHeight()你的活动方法。

修改

onWindowFocusChanged()