Android 在设置位图之前获取ImageView宽度和高度

Android 在设置位图之前获取ImageView宽度和高度,android,imageview,out-of-memory,Android,Imageview,Out Of Memory,我的布局中有一个操作栏、文本视图和图像视图。Imageview的宽度和高度与父项匹配。Imageview占用视图中剩余的空间。我想给视图设置一个位图,但是太大了。因此,我首先要获得imageview的宽度和高度,并使用它们来缩小位图,然后将其设置为imageview。我曾尝试在OnCreate中获取imageview的宽度和高度,但结果是0,0,可能是因为imageview尚未创建 请建议怎么做 谢谢。您尝试过这个链接吗 基本上有这样一种方法,特别用于防止由于大位图而导致的内存问题。首先读取尺

我的布局中有一个操作栏、文本视图和图像视图。Imageview的宽度和高度与父项匹配。Imageview占用视图中剩余的空间。我想给视图设置一个位图,但是太大了。因此,我首先要获得imageview的宽度和高度,并使用它们来缩小位图,然后将其设置为imageview。我曾尝试在OnCreate中获取imageview的宽度和高度,但结果是0,0,可能是因为imageview尚未创建

请建议怎么做


谢谢。

您尝试过这个链接吗


基本上有这样一种方法,特别用于防止由于大位图而导致的内存问题。首先读取尺寸,然后读取缩放样本。

您需要使用PreDrawListener上的
ViewTreeObserver

ImageView iv = (ImageView)findViewBYId(R.id.imageview);
ViewTreeObserver observer = iv.getViewTreeObserver()
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

    public boolean onPreDraw(){
        observer.removeOnPreDrawListener(this);
        //do your stuff here
    }
}

如果您只对特定ImageView的布局更改感兴趣,那么在其上安装布局侦听器可能是一种方法:

imageView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        // do stuff
    }
});

在onCreate方法中使用ViewTreeObserver。我在onCreate中的imageView上尝试了ViewTreeObserver,但onGlobalLayout中imageView的宽度和高度仍然为0,0.:-(感谢回复。我对此感到敬畏。我想知道imageview的尺寸,并使用这些尺寸缩小位图。因此,问题不在于将位图加载到内存中,而在于在设置位图之前获取imageview的尺寸。感谢回复。我将尝试它,但我很好奇这是否是一个好的练习。)在OnPreDraw中将位图设置为imageview?为什么您认为不是?如果需要,这是获取图像视图大小以缩小图像的唯一方法。我在observer上获取IllegalStateException。removeOnPreDrawListener(this);java.lang.IllegalStateException:此ViewTreeObserver不活动,请调用getViewTreeObserver()再次在android.view.ViewTreeObserver.checkIsAlive(ViewTreeObserver.java:720)在android.view.ViewTreeObserver.removeOnPreDrawListener(ViewTreeObserver.java:563)
如果(observer.isAlive()
则删除Listener我尝试了它。它现在没有引发任何异常。但是,onPreDraw()调用三次,imageview的高度和宽度始终为零。