ImageView位图缩放尺寸

ImageView位图缩放尺寸

问题描述:

我有一个大于ImageView的位图,我将它放入。我将ScaleType设置为center_inside。如何获得缩小图像的尺寸?ImageView位图缩放尺寸

好的。我应该更清楚了。在绘制到屏幕之前,我需要缩放位图的高度和宽度,以便我可以在正确的位置绘制一些覆盖图。我知道在原始位图叠加层的位置,但不是缩放。我想出了一些简单的公式来计算他们应该在缩放的位图上的位置。

我会解释我做了什么,以防其他人可能有一天需要这样做。

我得到了位图的原始宽度和高度。该ImageView的的高度和宽度是硬编码在XML文件在335

int bitmap_width = bmp.getWidth(); 
int bitmap_height = bmp.getHeight(); 

我确定哪一个是较大的,这样我可以正确地找出哪一个到基座的计算关闭的。对于我目前的例子,宽度更大。由于宽度被缩小到ImageView的宽度,我必须找到缩小的高度。我只是将ImageView宽度与Bitmap宽度的比率乘以Bitmap的高度。

int blank_space_buffer = (image_view_height - scaled_height)/2; 
:司利用最后完成,因为整数除法首先将导致0

int scaled_height = image_view_width * bitmap_height/bitmap_width; 

随着缩放高度我能确定的经缩放位图的两侧空白量的答案

要确定覆盖层应该在缩放的位图上的位置的x和y坐标,我必须使用原始坐标和这些计算的数字。这个例子中的x坐标很容易。由于缩放后的宽度是ImageView的宽度,因此我只需将ImageView的宽度与原始x坐标之间的Bitmap宽度的比率相乘即可。

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; 

这适用于我所需要的。如果高度大于宽度,只需反转宽度和高度变量即可。

这里是我如何做到这一点:

ImageView iv = (ImageView)findViewById(R.id.imageview); 
Rect bounds = iv.getDrawable().getBounds(); 
int scaledHeight = bounds.height(); 
int scaledWidth = bounds.width(); 

您可以使用可绘制的getIntrinsicWidth()或高度的方法,如果你想获得的原始大小。

编辑:好的,如果你想在onCreate运行时访问这些边界,你必须等待并检索它们,直到布局过后。虽然我不知道这是最好的方式,但这是我能够实现的。基本上,将侦听器添加到ImageView中,并在将其绘制到屏幕之前获取尺寸。如果您需要根据检索的维度进行任何布局更改,则应该在onPreDraw()中执行此操作。

ImageView iv = (ImageView)findViewById(R.id.imageview); 
int scaledHeight, scaledWidth; 
iv.getViewTreeObserver().addOnPreDrawListener(
    new ViewTreeObserver.OnPreDrawListener() { 
    @Override 
    public boolean onPreDraw() { 
     Rect rect = iv.getDrawable().getBounds(); 
     scaledHeight = rect.height(); 
     scaledWidth = rect.width(); 
     iv.getViewTreeObserver().removeOnPreDrawListener(this); 
     return true; 
    } 
}); 
+0

对于bounds.height()和bounds.width()返回0 ... – Jay 2011-02-17 19:57:10

+0

更新了我的文章。 – kcoppock 2011-02-17 21:49:33

试试这个代码:

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()