5

我已经尝试了很长时间来设置位图,以便它适合ImageView边界。

它只是无法通过scaleType: fitXY. 我的位图图像尺寸小于ImageView(保存为 100X100 像素),我希望我的位图图像适合并拉伸到ImageView.

这是一些代码:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/imageView" 
   android:layout_height="match_parent"
   android:layout_width="match_parent"
   android:src="@drawable/locked_image"
   android:scaleType="fitXY"
/>

这是设置的代码ImageView(我scaleType在不同的地方设置测试):

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  final ImageView imageView;
  if (convertView == null) {
    imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
    imageView.setScaleType(ScaleType.FIT_XY);
  } else {
    imageView = (ImageView) convertView;
    imageView.setScaleType(ScaleType.FIT_XY);
  }

  imageLoader.displayImage(imagesIds[position], imageView, options);
  imageView.setScaleType(ScaleType.FIT_XY);
  return imageView;
}

这是它的外观:

在此处输入图像描述

如您所见,高度ImageView很好,但我希望它的宽度相同。我无法通过我的活动访问我的位图图像,所以请不要让我调整我的位图大小。我真的不明白为什么它不能正常工作。


编辑:
只是为了让问题更容易理解。ImageView为每个设备计算高度。每个设备都不同。我希望我的宽度ImageView与它的高度相同。Two-WayGridView如果有任何区别,我正在使用该库来显示图像。

4

4 回答 4

10

使用scaleType不会像您认为的那样改变 ImageView 的大小。它所做的只是将位图缩放到 ImageView 的大小从您的屏幕截图来看,它做得很好)。

如果您想制作方形 ImageView,您应该尝试查看这个问题

另外,我不确定我是否理解您使用TwoWayGridView库的原因。它专门设计用于允许您说明行数/列数,并且它会拉伸项目以适应。这似乎与您想要的完全相反,因为您想让它们成正方形。onMeasure()只要您像链接的问题/答案中显示的那样覆盖每个项目的,普通的 GridView 将起作用。

于 2013-07-29T17:35:16.077 回答
3

我想知道您使用什么容器小部件来保存 ImageView。
例如... GridView、ListView 等...
如果您使用 GridView,您尝试通过 GridView.setNumColumns() 设置列数。

如果仍然不起作用,您尝试通过多种方式之一使用 AspectRatioFrameLayout 类。
这个类很简单。请按照以下步骤操作!


1.在res/attrs.xml中添加属性

<declare-styleable name="AspectRatioFrameLayout">
    <attr name="aspectRatio" format="float" />
</declare-styleable>


2.创建AspectRatioFrameLayout类

public class AspectRatioFrameLayout extends FrameLayout {
    private static final String TAG = "AspectRatioFrameLayout";
    private static final boolean DEBUG = false;

    private float mAspectRatio; // width/height ratio

    public AspectRatioFrameLayout(Context context) {
        super(context);
    }

    public AspectRatioFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        initAttributes(context, attrs);
    }

    public AspectRatioFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        initAttributes(context, attrs);
    }

    private void initAttributes(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AspectRatioFrameLayout);

        mAspectRatio = typedArray.getFloat(R.styleable.AspectRatioFrameLayout_aspectRatio, 1.0f);

        typedArray.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        if (DEBUG) Log.d(TAG, "widthMode:"+widthMode+", heightMode:"+heightMode);
        if (DEBUG) Log.d(TAG, "widthSize:"+widthSize+", heightSize:"+heightSize);

        if ( widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY ) {
            // do nothing
        } else if ( widthMode == MeasureSpec.EXACTLY ) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec((int)(widthSize / mAspectRatio), MeasureSpec.EXACTLY);
        } else if ( heightMode == MeasureSpec.EXACTLY ) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec((int)(heightSize * mAspectRatio), MeasureSpec.EXACTLY);
        } else {
            // do nothing
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}


3.修改list_item_image.xml

<your.package.AspectRatioFrameLayout       
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    app:aspectRatio="1">

    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/imageView" 
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:src="@drawable/locked_image"
        android:scaleType="fitXY"
    />
</your.package.AspectRatioFrameLayout>
于 2013-12-13T12:02:17.657 回答
1

不要使用 src 属性,而是使用 imageView 的背景属性。位图将被拉伸。

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/imageView" 
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@drawable/locked_image"
android:scaleType="fitXY"
/>
于 2013-07-29T17:33:31.377 回答
-2

将背景与 fitxy 一起使用,而不是使用 src。它将拉伸您的图像:

android:background="@drawable/locked_image"
android:scaleType="fitXY"
于 2016-06-14T10:53:33.300 回答