Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何找到ImageView的宽度/高度?_Android_Image_Height_Width - Fatal编程技术网

Android 如何找到ImageView的宽度/高度?

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

我的问题类似于。我曾经扩展ImageView以形成TouchImageView。在onCreate()方法中,我想调用

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。每当请求布局时,都会发生这种情况。很高兴它成功了