我的问题类似于this question。我使用this code扩展了ImageView以形成TouchImageView。在我的onCreate()方法中,我想调用
setImage(Bitmap bm, int displayWidth, int displayHeight)
但我不知道要使用的宽度或高度。当我调用getHeight()时,它给我零。
我尝试使用kcoppock对previously mentioned question的回答来避免使用0,但未成功。 onPreDraw()监听器每秒被调用几次,我无法弄清楚如何只调用一次。
答案 0 :(得分:3)
对于这样的事情来说,这是一种脆弱的方法。 Android视图使用onMeasure
方法按其父视图进行衡量。通过为要扩展的setImage
方法提供初始大小(特别是如果您根据显示大小设置它),只要您希望将此View嵌套在其他视图中,就会引发复杂性。像平板电脑这样的大屏幕设备就是一个很好的例子。
更惯用的方法是在没有宽度/高度参数的情况下实现TouchImageView的setImage
方法。相反,它会推迟设置比例和矩阵,直到测量并实现onMeasure
这样的事情:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mNeedsInitialScale) { // Set by setImage when a new image is set
// The measured width and height were set by super.onMeasure above
setInitialScale(getMeasuredWidth(), getMeasuredHeight());
mNeedsInitialScale = false;
}
}
setInitialScale
方法在调用setImage
后执行链接super.setImageBitmap
方法执行的所有操作的位置。 setImage
还应将mNeedsInitialScale
字段设置为true
。
这样您就不必担心要使用的初始尺寸,只要设置了新图像,就会在正常测量期间从视图中自动获取。
答案 1 :(得分:1)
ImageViews尺寸为0,直到您的“活动”在屏幕上绘制它。您可以使用Activity onFocusChanged来设置位图并获得正确的尺寸 如果你只是在寻找DisplayWidth和高度,你可以调用
Display d = getSystemService(WINDOW_SERVICE).getDefaultDisplay();
并询问展示尺寸