Android ImageView位图缩放尺寸

Android ImageView位图缩放尺寸,android,bitmap,imageview,Android,Bitmap,Imageview,我有一个位图,它比我放入的ImageView大。我已将ScaleType设置为内部居中。如何获得缩小图像的尺寸?以下是我的操作方法: ImageView iv = (ImageView)findViewById(R.id.imageview); Rect bounds = iv.getDrawable().getBounds(); int scaledHeight = bounds.height(); int scaledWidth = bounds.width(); 如果要获得原始尺寸,可以

我有一个位图,它比我放入的ImageView大。我已将ScaleType设置为内部居中。如何获得缩小图像的尺寸?

以下是我的操作方法:

ImageView iv = (ImageView)findViewById(R.id.imageview);
Rect bounds = iv.getDrawable().getBounds();
int scaledHeight = bounds.height();
int scaledWidth = bounds.width();
如果要获得原始尺寸,可以使用Drawable的
getIntrinsicWidth()
或height方法

编辑:好的,如果您试图在运行onCreate时访问这些边界,那么您必须等待并检索它们,直到布局传递之后。虽然我不知道这是最好的方法,但我就是这样做到的。基本上,在ImageView中添加一个侦听器,并在它被绘制到屏幕之前获取您的尺寸。如果需要对检索到的标注进行任何布局更改,应在onPreDraw()中进行

请尝试以下代码:

final ImageView iv = (ImageView) findViewById(R.id.myImageView); 
ViewTreeObserver vto = iv.getViewTreeObserver();  
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
    @Override  
    public void onGlobalLayout() {  
        Toast.makeText(MyActivity.this, iv.getWidth() + " x " + iv.getHeight(), Toast.LENGTH_LONG).show(); 
        iv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    }  
});  

否则,您可以通过将此视图设置为自定义视图来使用
onSizeChange()

确定。我可能应该说得更清楚些。我需要缩放位图的高度和宽度,然后才能将其绘制到屏幕上,以便在正确的位置绘制一些覆盖图。我知道覆盖层在原始位图中的位置,但不知道缩放的位置。我想出了一些简单的公式来计算它们在缩放位图上的位置

我会解释我做了什么,以防有一天其他人需要

我得到了位图的原始宽度和高度。ImageView的高度和宽度在335处的xml文件中硬编码

int bitmap_width = bmp.getWidth();
int bitmap_height = bmp.getHeight();
我决定哪一个更大,这样我就可以正确地计算出哪一个更大。对于我当前的示例,宽度更大。由于宽度已缩小到ImageView的宽度,因此我必须找到缩小的高度。我只是将ImageView的宽度与位图的宽度之比乘以位图的高度。除法是最后一次进行的,因为整数除法第一次会得到0的答案

int scaled_height = image_view_width * bitmap_height / bitmap_width;
通过缩放高度,我可以使用以下方法确定缩放位图任一侧的空白量:

int blank_space_buffer = (image_view_height - scaled_height) / 2;
要确定覆盖在缩放位图上的位置的x和y坐标,我必须使用原始坐标和这些计算出的数字。本例中的x坐标很简单。由于缩放的宽度是ImageView的宽度,我只需要将ImageView的宽度与位图的宽度之比乘以原始x坐标

int new_x_coord = image_view_width * start_x / bitmap_width;
y坐标有点复杂。取位图缩放高度与位图原始高度的比率。将该值与原始y坐标相乘。然后添加空白区域缓冲区。
int new_y_coord = scaled_height * start_y / bitmap_height + blank_space_buffer;

这是我需要的。如果高度大于宽度,只需反转宽度和高度变量。

此线程中有这么多可怕的答案,请查看以正确执行此操作您好,您是否在模拟器上尝试了您的代码?它在我的真实设备上以1920*1080的分辨率工作,但在模拟器(Nexus 5 1920*1080)上,新坐标太小了。@Jay您的答案中的start_x和start_y是什么?
int new_y_coord = scaled_height * start_y / bitmap_height + blank_space_buffer;