我有一个比我正在使用的ImageView更大的Bitmap。我将ScaleType设置为center_inside。如何获得缩小图像的尺寸?
答案 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()
。