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;
}
});
试试这个代码:
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()
。
对于bounds.height()和bounds.width()返回0 ... – Jay 2011-02-17 19:57:10
更新了我的文章。 – kcoppock 2011-02-17 21:49:33