5

我想拉伸图像以填充宽度并根据宽度调整高度并保持纵横比。我希望它应该覆盖整个宽度(fillparent),并且图像视图的高度应该像这样调整,以便保持纵横比。

我尝试了 fit_xy 但不适用于我的情况。请帮我

4

4 回答 4

10

即使您设置比例类型 fit_xy,也有两种可能的解决方法

1) 默认情况下,Android 会缩小图像以适应 ImageView,保持纵横比。但是,请确保您将图像设置为 ImageView 使用android:src="..."而不是android:background="...". src=使其缩放图像保持纵横比,但background=使其缩放扭曲图像以使其完全适合 ImageView 的大小。(不过,您可以同时使用背景和源,这对于仅使用一个 ImageView 在主图像周围显示框架等非常有用。)

2)您还应该看到android:adjustViewBounds使 ImageView 调整自身大小以适应重新缩放的图像。例如,如果您在通常是方形的 ImageView 中有一个矩形图像,则 adjustViewBounds=true 将使其也将 ImageView 的大小调整为矩形。这会影响其他视图在 ImageView 周围的布局方式。

您可以使用参数更改默认缩放图像的方式android:scaleType。顺便说一句,发现它是如何工作的最简单的方法就是自己尝试一下!请记住查看模拟器本身(或实际手机)中的布局,因为 Eclipse 中的预览通常是错误的。

于 2013-11-07T06:51:31.743 回答
3

我不确定我使用的功能何时添加到 Android SDK 但有一个简单的解决方案可以完全满足 OP 的要求:

正如预期的那样,将 layout:width 和 layout:height 设置为 fill_parent。

正如另一个响应者正确提到的那样,使用 src 来查找您的图像,而不是背景。

但是,不要尝试 fit_xy 的 scaleType(它会找到适合视图的最窄边而不是最长边),而是使用 centerCrop 的 scaleType。

centerCrop 将居中并填充视口,同时保持纵横比。

希望这可以帮助!我将它用于我为当前雇主开发的商业应用程序的 webView 加载覆盖。

复制/粘贴解决方案:在您的活动 XML 文件中,添加以下行:

<ImageView
    android:id="@+id/logo"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:scaleType="centerCrop"
    android:src="@drawable/your_image_name"
    />
于 2014-03-07T21:49:07.770 回答
2

有两种方法:首先找到显示的高度和宽度,然后调用这个方法

private void scaleImage(int displayWidth) {

    // Get the ImageView and its bitmap

             width=displayWidth;
    Drawable drawing = holder.imagepost.getDrawable();

    {
        Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();


        int bounding = dpToPx(width);

        // Determine how much to scale: the dimension requiring less
        // scaling is
        // closer to the its side. This way the image always stays
        // inside your
        // bounding box AND either x/y axis touches it.
        float xScale = ((float) bounding) / width;
        float yScale = ((float) bounding) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        // Create a matrix for the scaling and add the scaling data
        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        // Create a new bitmap and convert it to a format understood by
        // the ImageView
        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
                height, matrix, true);
        width = scaledBitmap.getWidth(); // re-use
        height = scaledBitmap.getHeight(); // re-use
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);

        // Apply the scaled bitmap
        holder.imagepost.setImageDrawable(result);

        // Now change ImageView's dimensions to match the scaled image
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.imagepost
                .getLayoutParams();
        params.width = width;
        params.height = height;
        holder.imagepost.setLayoutParams(params);

    }

}

private int dpToPx(int dp) {
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round((float) dp * density);
}

或者我知道的最好的方法是使用 Android Query

这是链接http://code.google.com/p/android-query/ ,您可以从那里自行下载。下面是保持纵横比的代码

aq.id(R.id.imageView)

                .image(imageString, true, true,
                        displaywidth, 0, null, AQuery.FADE_IN, AQuery.RATIO_PRESERVE);
于 2013-11-07T07:01:15.500 回答
1

下面的解决方案对我来说很好。

使用 AQuery Libray 选项“AQuery.RATIO_PRESERVE”来保持纵横比:

aq.id(R.id.imgView).progress(R.id.imgPb).image(url, true, true,150, 0,null,AQuery.FADE_IN,AQuery.RATIO_PRESERVE);

对 ImageView 使用以下设置:

<ImageView
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:scaleType="fitXY"/>

对自动 GridView 列使用以下设置:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/gridView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:numColumns="auto_fit"
 android:columnWidth="150dp"/>
于 2014-12-30T12:04:15.567 回答