ImageView位图缩放尺寸

时间:2011-02-17 19:40:39

标签: android bitmap imageview

我有一个比我正在使用的ImageView更大的Bitmap。我将ScaleType设置为center_inside。如何获得缩小图像的尺寸?

3 个答案:

答案 0 :(得分:10)

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

我会解释我的所作所为,万一其他人可能有一天需要这个。

我得到了Bitmap的原始宽度和高度。 ImageView的高度和宽度在335的xml文件中进行了硬编码。

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

我确定哪一个更大,以便我可以正确地找出哪一个基于计算。对于我当前的例子,宽度更大。由于宽度缩小到ImageView的宽度,我必须找到缩小的高度。我只是将ImageView宽度的比例乘以Bitmap的宽度乘以Bitmap的高度。分割是最后完成的,因为整数分区首先会得到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宽度与Bitmap宽度的比率乘以原始x坐标。

int new_x_coord = image_view_width * start_x / bitmap_width;

y坐标有点棘手。获取Bitmap的缩放高度与Bitmap原始高度的比率。将该值乘以原始y坐标。然后添加空白区域缓冲区。

int new_y_coord = scaled_height * start_y / bitmap_height + blank_space_buffer;

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

答案 1 :(得分:2)

我是这样做的:

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

如果您想获得原始尺寸,可以使用Drawable的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;
    }
});

答案 2 :(得分:-1)

试试这段代码:

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