【问题标题】:How to stretch the image in the proper direction?如何以正确的方向拉伸图像?
【发布时间】:2014-10-16 09:21:41
【问题描述】:

假设我前几天拍摄的这个美丽蘑菇的图像的大小是未知的。它可以是 350x500 像素或 1080x1920 或 1920x1080 或 1x1。任何图像都应该可以在这里使用。

我想要完成的是:我需要将图像一直拉伸到它会尽快与父视图边缘相遇的方向,但不占用其他两个方向的任何区域

下面是一个示例:我有一个垂直图像,我需要在平板电脑上显示它。在这种情况下,它需要上下拉伸(并保持纵横比),而不是左右拉伸。 左边和右边的黑色区域没有被占用是很重要的。它应该是这样的:

如果它比父视图宽,则需要左右拉伸相同的图像,但不需要上下拉伸:

这是我尝试过的:

  1. 将 xml layout_widthlayout_height 属性设置为 match_parentwrap_content 的不同组合。这不起作用,因为我们无法确定如何在编译时拉伸图像,因为我们没有图像的尺寸,也没有容器的尺寸。

  2. 尝试像this那样以编程方式拉伸位图,但这只会拉伸宽度,效率有点低。

如果有一种方法可以根据图像比例与父容器比例的比较,以编程方式调整 ImageView 的 LayoutParams,那就太好了。有谁知道这样做的干净方法吗?

【问题讨论】:

  • 您尝试过缩放类型 CENTER_INSIDE 吗?见developer.android.com/reference/android/widget/…
  • 所以您是说视图的imageView.setScaleType(ScaleType.CENTER_INSIDE)ScaleType.CROP 是不够的,因为您正试图在此过程中做出一些复杂的决策?
  • @Henry center_inside 如果图像太小,则根本不会拉伸图像。如果我使用wrap_content,它将保持图像的原始大小。如果我使用match_parent,它仍然会保持图像的原始大小,即使视图占据了整个父级。
  • @JaySnayder 你的意思是ScaleType.CENTER_CROP?我不想裁剪它。我想将所有内容保留在内部并保持纵横比相同。我在上面的评论中解释了为什么CENTER_INSIDE 不起作用
  • @Oleksiy 对不起,我的意思是ScaleTYPE.CENTER。根据定义,如果您将match_parent 指定为ImageView 大小,则应在保持纵横比的同时填充一个方向。但是,也许我仍然误解了这个问题。我以为这就是你的目标。

标签: android imageview stretch


【解决方案1】:

我认为没有开箱即用的ScaleType 机制。你需要确定你的并使用Matrix 类来扩展它。

这是我用来获取附件图片的封面照片的代码,以显示我的自定义ScaleType

int boundBoxSize = getResources().getDimensionPixelSize(R.dimen.user_profile_avatar_size);
int border = getResources().getDimensionPixelSize(R.dimen.user_profile_avatar_border);

Drawable drawing = imageView.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();

int width = bitmap.getWidth();
int height = bitmap.getHeight();

float xScale = ((float) boundBoxSize)/width;
float yScale = ((float) boundBoxSize)/height;
float scale = (xScale <= yScale) ? xScale : yScale;

Matrix matrix = new Matrix();
matrix.postScale(scale, scale);

Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
width = scaledBitmap.getWidth();
height = scaledBitmap.getHeight();
imageView.setImageBitmap(scaledBitmap);

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.width = width + (2*border);
layoutParams.height = height + (2*border);

imageView.setLayoutParams(layoutParams);
imageView.setBackgroundColor(getResources().getColor(R.color.image_border));
imageView.setPadding(border, border, border, border);

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多