Android 如何找到ImageView的宽度/高度?
我的问题类似于。我曾经扩展ImageView以形成TouchImageView。在onCreate()方法中,我想调用Android 如何找到ImageView的宽度/高度?,android,image,height,width,Android,Image,Height,Width,我的问题类似于。我曾经扩展ImageView以形成TouchImageView。在onCreate()方法中,我想调用 setImage(Bitmap bm, int displayWidth, int displayHeight) 但我不知道要用的宽度或高度。当我调用getHeight()时,它给我零 我尝试使用的答案来避免0,但未成功。onPreDraw()监听器每秒调用几次,我不知道如何只调用一次。在您的活动将其绘制到屏幕上之前,ImageViews维度为0。您可以使用Activitys
setImage(Bitmap bm, int displayWidth, int displayHeight)
但我不知道要用的宽度或高度。当我调用getHeight()时,它给我零
我尝试使用的答案来避免0,但未成功。onPreDraw()监听器每秒调用几次,我不知道如何只调用一次。在您的活动将其绘制到屏幕上之前,ImageViews维度为0。您可以使用Activitys onFocusChanged设置位图并获得正确的尺寸 如果您只是想查看显示器的宽度和高度,可以拨打
Display d = getSystemService(WINDOW_SERVICE).getDefaultDisplay();
并要求Display提供其尺寸图像视图尺寸为0,直到您的活动将其绘制在屏幕上。您可以使用Activitys onFocusChanged设置位图并获得正确的尺寸 如果您只是想查看显示器的宽度和高度,可以拨打
Display d = getSystemService(WINDOW_SERVICE).getDefaultDisplay();
并询问Display的尺寸对于这样的东西,这是一种脆弱的方法。Android视图由其父视图使用
onMeasure
方法测量。通过为要缩放到的setImage
方法提供初始大小(特别是如果您根据显示大小进行设置),每当您希望将此视图嵌套到其他视图中时,都会增加复杂性。像平板电脑这样的大屏幕设备就是一个很好的例子
一种更为惯用的方法是实现TouchImageView的setImage
方法,而不使用任何宽度/高度参数。相反,它会将刻度和矩阵的设置推迟到测量,并实施类似以下内容的测量:
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
方法在调用super.setImageBitmap
后执行链接的setImage
方法执行的所有操作setImage
还应将mneedsinialscale
字段设置为true
这样,您就不必担心要使用的初始尺寸,只要设置了新图像,在正常测量过程中就会自动从视图中获取该尺寸。这是一种脆弱的方法。Android视图由其父视图使用
onMeasure
方法测量。通过为要缩放到的setImage
方法提供初始大小(特别是如果您根据显示大小进行设置),每当您希望将此视图嵌套到其他视图中时,都会增加复杂性。像平板电脑这样的大屏幕设备就是一个很好的例子
一种更为惯用的方法是实现TouchImageView的setImage
方法,而不使用任何宽度/高度参数。相反,它会将刻度和矩阵的设置推迟到测量,并实施类似以下内容的测量:
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
方法在调用super.setImageBitmap
后执行链接的setImage
方法执行的所有操作setImage
还应将mneedsinialscale
字段设置为true
这样,您就不必担心要使用的初始尺寸,只要设置了新图像,在正常测量过程中会自动从视图中获取该尺寸。谢谢您的回答。这就解决了我的问题,我的代码现在好多了。实际上,它看起来工作得很好,但是
getMeasuredWidth()
和getMeasuredHeight()
似乎返回了父视图的宽度和高度。结果是onMeasure(int int int)
被多次调用以测量ImageView
。我希望每当添加兄弟姐妹时都会调用它。我移动了mneedsinialscale=false
到我的setScale(float)
方法的开头,现在它工作正常。是的,每当要求视图使用与上次不同的度量值进行度量时,都会调用onMeasure。每当请求布局时,都会发生这种情况。很高兴它成功了谢谢你的回答。这就解决了我的问题,我的代码现在好多了。实际上,它看起来工作得很好,但是getMeasuredWidth()
和getMeasuredHeight()
似乎返回了父视图的宽度和高度。结果是onMeasure(int int int)
被多次调用以测量ImageView
。我希望每当添加兄弟姐妹时都会调用它。我移动了mneedsinialscale=false
到我的setScale(float)
方法的开头,现在它工作正常。是的,每当要求视图使用与上次不同的度量值进行度量时,都会调用onMeasure。每当请求布局时,都会发生这种情况。很高兴它成功了