ImageView:填充水平维持高宽比

我需要一个ImageView缩放它的图像,直到水平填充父级。

如果imageview背景为红色,并且其余内容(图片下方)为绿色,我正在查找图1所示的结果。 如果图像宽度高于屏幕宽度,则会自动获得该结果。

但是如果是像图片2中的小图片,我可以得到的最好结果是图片3 (将ImageView的宽度和高度设置为fill_parent ,将scaleType设置为FitStart

图片4获得了设置height = wrap_content,width = fill_parent,scaleType = CenterCrop。 它应该垂直缩放以显示整个图像,但是scaleType会裁剪它。

即使图像很小,也可以获取图片1的任何想法?

将给予50分的酬金作为工作答案

在这里输入图像描述


我发现了一个简单的解决方案,对我来说真的很好。 根据需要设置宽度和高度,例如:

android:layout_width="fill_parent"
android:layout_height="wrap_content"

然后你也设置这个设置:

android:adjustViewBounds="true"

“adjustViewBounds”默认为false(我觉得奇怪),但设置它可以很容易地在imageview中填充图像。


没有自定义类是可行的。 这是我用小图片获得的结果: 在这里输入图像描述

大图像: 在这里输入图像描述

您必须使用RelativeLayout才能实现此功能,但您可以将其与LinearLayout结合使用以实现您所需的任何功能。 这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <LinearLayout
            android:id="@+id/button_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentBottom="true"
            >
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </LinearLayout>
        <ImageView 
            android:src="@drawable/cat"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            android:layout_above="@id/button_container"/>
    </RelativeLayout>
</ScrollView>

诀窍是你将它设置为填满屏幕,但它必须高于其他布局。 这样你就可以实现你需要的一切。


试试这个:

import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ViewGroup;

public class CustomImageView extends android.widget.ImageView {

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

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

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void fitYUniformly() {
        final Drawable drawable = getDrawable();
        if (drawable == null) return;

        final int dwidth = drawable.getIntrinsicWidth();
        final int dheight = drawable.getIntrinsicHeight();
        if (dwidth == -1 || dheight == -1) return;

        int vheight = this.getHeight();
        float scale = (float) vheight / (float) dheight;

        final int vwidth = (int) (dwidth * scale);
        scale(scale, vwidth, vheight);
    }

    public void fitXUniformly(int parentWidth) {
        final Drawable drawable = getDrawable();
        if (drawable == null) return;

        final int dwidth = drawable.getIntrinsicWidth();
        final int dheight = drawable.getIntrinsicHeight();
        if (dwidth == -1 || dheight == -1) return;

        int vwidth = parentWidth;// here,you need to pass the width of parentview
    //  int vwidth = this.getWidth();           
        float scale = (float) vwidth / (float) dwidth;

        final int vheight = (int) (dheight * scale);
        scale(scale, vwidth, vheight);
    }

    private void scale(float scale, int newWidth, int newHeight) {
        final ViewGroup.LayoutParams params = this.getLayoutParams();
        params.width = newWidth;
        params.height = newHeight;
        this.setLayoutParams(params);
        this.setScaleType(ScaleType.MATRIX);
        final Matrix matrix = new Matrix();
        matrix.setScale(scale, scale);
        this.setImageMatrix(matrix);
    }

}

注意:

不要忘记调用fitXUniformly(parentWidth); 。 在这里, parentWidth将是CustomImageView父级的宽度。

我希望它会有帮助!

链接地址: http://www.djcxy.com/p/58093.html

上一篇: ImageView: fill horizontal maintaining aspect ratio

下一篇: Use blocks from included files for parent in jinja2