Android ImageView设置Bitmap FitXY不起作用

时间:2013-07-27 18:47:18

标签: android image imageview scale android-imageview

我一直在努力设置位图,以便它适合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;
}

以下是它的外观:

enter image description here

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


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

4 个答案:

答案 0 :(得分:9)

使用scaleType不会改变ImageView的大小,因为您似乎应该这样做。它所做的就是将位图缩放到 的ImageView(它的效果非常好,从你的截图判断)。

如果你想制作方形ImageView,你应该尝试查看this question

另外,我不确定我理解你为什么使用TwoWayGridView库。它专门设计用于指定行/列的数量,并且它将拉伸项目以适应。这似乎与你想要的完全相反,因为你想让它们成为正方形。如果您覆盖链接的问题/答案中显示的每个项目的onMeasure(),则普通的GridView将起作用。

答案 1 :(得分: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>

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

使用背景与fitxy而不是使用src。它会拉伸你的形象:

android:background="@drawable/locked_image"
android:scaleType="fitXY"