【问题标题】:How to maintain the aspect ratio of the image if imageview first stretch to fill parent如果imageview首先拉伸以填充父级,如何保持图像的纵横比
【发布时间】:2013-11-18 17:17:21
【问题描述】:

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

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

【问题讨论】:

  • 你需要在dp中设置图片的高度,因为只有dp会根据屏幕的大小而变化。
  • 但它应该很好..我不能在这里设置固定..我也想保持纵横比
  • dp 会自动调整自己。

标签: android android-imageview aspect-ratio


【解决方案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"/>

【讨论】:

    【解决方案2】:

    我不确定我使用的功能何时添加到 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"
        />
    

    【讨论】:

    • 我根据您的出色回答添加了复制/粘贴解决方案。请根据需要编辑/删除。
    • 感谢 Bart van Kuik,非常感谢 :-)
    【解决方案3】:

    即使您设置比例类型 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 中的预览通常是错误的。

    【讨论】:

    • 这实际上并没有解决 OP 的问题,因为这个答案提供的解决方案都没有填满屏幕并正确保持纵横比。然而,对于那些希望了解更多关于 android 视图系统如何工作的人来说,这个答案中有有用的信息。我的回答(如下)确实正确解决了 OP 的要求,因此也值得一看。
    【解决方案4】:

    有两种方法可以做到这一点: 先找到显示的高宽,调用这个方法

    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);
    

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 2013-08-07
      • 2012-03-26
      • 2013-04-17
      • 2010-10-13
      • 2011-06-08
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多