如果imageview第一次拉伸以填充父级,如何保持图像的宽高比

时间:2013-11-07 06:41:28

标签: android android-imageview aspect-ratio

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

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

4 个答案:

答案 0 :(得分:10)

即使您设置了比例类型fit_xy

,也有两种可能的解决方法

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

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

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

答案 1 :(得分:3)

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

正如预期的那样,设置layout:width和layout:height to 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"
    />

答案 2 :(得分: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查询

这是链接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);

答案 3 :(得分:1)

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

使用AQuery Libray选项&#34; AQuery.RATIO_PRESERVE&#34;保持宽高比:

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"/>