Java Android Imageview:未指定测量值以计算位图尺寸
谷歌建议从缩小的资源中加载位图,具体取决于实际的ImageView大小(《谷歌开发者指南》中的“高效加载大型位图”)。因此,在解码位图之前,我必须知道ImageView的宽度和高度 我的代码与下面发布的代码类似Java Android Imageview:未指定测量值以计算位图尺寸,java,android,user-interface,bitmap,imageview,Java,Android,User Interface,Bitmap,Imageview,谷歌建议从缩小的资源中加载位图,具体取决于实际的ImageView大小(《谷歌开发者指南》中的“高效加载大型位图”)。因此,在解码位图之前,我必须知道ImageView的宽度和高度 我的代码与下面发布的代码类似decodeSampledBitmapFromResources将位图作为存储在资源中的位图的缩小版本返回 public void onCreate(Bundle savedInstanceSate) { super.onCreate(savedInstanceState);
decodeSampledBitmapFromResources
将位图作为存储在资源中的位图的缩小版本返回
public void onCreate(Bundle savedInstanceSate)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.myLayout)
ImageView imageView = (ImageView) findViewById(R.id.myImageView);
/**
At this point, I need to calculate width and height of the ImageView.
**/
Bitmap bitmap = MyBitmapManager.decodeSampledBitmapFromResource(
getResources(), R.drawable.my_icon, width, height);
imageView.setImageBitmap(bitmap);
}
问题是,在onCreate中,ImageView还没有任何宽度和高度。getWidth()和getHeight()仅返回0。在实际绘制视图之前,我无意中发现了计算视图大小的代码:
ImageView v = findViewById(R.id.myImageView);
v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int width = v.getMeasuredWidth();
int height = v.getMeasuredHeight();
这适合我的情况吗?我试过了,上面的代码返回了一些宽度和高度的值,这些值似乎是正确的,但我不确定这是否是正确的方法
更新:
经过更多的测试,这似乎不起作用。
在上面的例子中,我使用了一个192x192像素的PNG。
在如上所示测量ImageView之后,我得到了128x128的测量尺寸。
如果在位图设置为imageview后调用getWidth()和getHeight(),则尺寸为100x100。
因此,在这种情况下,映像将从192x192缩小到128x128,但不会像它应该的那样缩小到100x100
似乎Measurespec.UNSPECIFIED
总是返回大于末尾的维度
提前感谢,
danijoo我自己解决了这个问题:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw(){
// at this point, true width and height are already determined
int width = imageView.getMeasuredWidth();
int height = imageView.getMeasuredHeight();
Bitmap bitmap = MyBitmapManager.decodeSampledBitmapFromResource(
getResources(), R.drawable.my_icon, width, height);
imageView.setImageBitmap(bitmap);
// this is important because onPreDrawn is fired multiple times
imageView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
}